Skip to content

Commit

Permalink
Suppress duplicate jwk generation for the well-known jwks route too
Browse files Browse the repository at this point in the history
  • Loading branch information
terev committed Nov 1, 2024
1 parent 1dd93ad commit 169b731
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 26 deletions.
14 changes: 3 additions & 11 deletions jwk/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@ import (
"github.com/ory/x/httprouterx"

"github.com/gofrs/uuid"
"github.com/pkg/errors"

"github.com/ory/x/urlx"

"github.com/ory/x/errorsx"
Expand Down Expand Up @@ -101,17 +99,11 @@ func (h *Handler) discoverJsonWebKeys(w http.ResponseWriter, r *http.Request) {
for _, set := range wellKnownKeys {
set := set
eg.Go(func() error {
k, err := h.r.KeyManager().GetKeySet(ctx, set)
if errors.Is(err, x.ErrNotFound) {
h.r.Logger().Warnf("JSON Web Key Set %q does not exist yet, generating new key pair...", set)
k, err = h.r.KeyManager().GenerateAndPersistKeySet(ctx, set, uuid.Must(uuid.NewV4()).String(), string(jose.RS256), "sig")
if err != nil {
return err
}
} else if err != nil {
keySet, err := GetOrGenerateKeySet(ctx, h.r, h.r.KeyManager(), set, uuid.Must(uuid.NewV4()).String(), string(jose.RS256))
if err != nil {
return err
}
keys <- ExcludePrivateKeys(k)
keys <- ExcludePrivateKeys(keySet)
return nil
})
}
Expand Down
28 changes: 13 additions & 15 deletions jwk/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@ import (

"github.com/ory/x/errorsx"

"github.com/ory/hydra/v2/x"

jose "github.com/go-jose/go-jose/v3"
"github.com/pkg/errors"
)
Expand All @@ -35,18 +33,23 @@ func EnsureAsymmetricKeypairExists(ctx context.Context, r InternalRegistry, alg,
}

func GetOrGenerateKeys(ctx context.Context, r InternalRegistry, m Manager, set, kid, alg string) (private *jose.JSONWebKey, err error) {
keys, err := m.GetKeySet(ctx, set)
if err != nil && !errors.Is(err, x.ErrNotFound) {
keySet, err := GetOrGenerateKeySet(ctx, r, m, set, kid, alg)
if err != nil {
return nil, err
}

if keys != nil && len(keys.Keys) > 0 {
privKey, privKeyErr := FindPrivateKey(keys)
if privKeyErr == nil {
return privKey, nil
}
privKey, err := FindPrivateKey(keySet)
if err != nil {
return nil, err
}
return privKey, nil
}

func GetOrGenerateKeySet(ctx context.Context, r InternalRegistry, m Manager, set, kid, alg string) (*jose.JSONWebKeySet, error) {
keys, err := m.GetKeySet(ctx, set)
if err == nil && (keys != nil && len(keys.Keys) > 0) {
return keys, nil
}
// Suppress duplicate key set generation jobs where the set+alg match.
keysResult, err, _ := jwkGenFlightGroup.Do(set+alg, func() (any, error) {
r.Logger().WithField("jwks", set).Warnf("JSON Web Key not found in JSON Web Key Set %s, generating new key pair...", set)
Expand All @@ -55,12 +58,7 @@ func GetOrGenerateKeys(ctx context.Context, r InternalRegistry, m Manager, set,
if err != nil {
return nil, err
}

privKey, err := FindPrivateKey(keysResult.(*jose.JSONWebKeySet))
if err != nil {
return nil, err
}
return privKey, nil
return keysResult.(*jose.JSONWebKeySet), nil
}

func First(keys []jose.JSONWebKey) *jose.JSONWebKey {
Expand Down

0 comments on commit 169b731

Please sign in to comment.