Skip to content
Merged
Show file tree
Hide file tree
Changes from 42 commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
ba7534f
fix: jwt validation blocks on multiple requests
SkArchon Sep 15, 2025
7aecf6a
Merge branch 'main' into milinda/eng-8149-jwk-refreshunknownkid-causi…
SkArchon Sep 15, 2025
79adec8
fix: review comments
SkArchon Sep 17, 2025
ca0aaac
fix: cleanup
SkArchon Sep 17, 2025
f56cae5
Merge branch 'main' into milinda/eng-8149-jwk-refreshunknownkid-causi…
SkArchon Sep 17, 2025
e0f1e53
fix: require equals
SkArchon Sep 17, 2025
3166aa8
Revert "fix: require equals"
SkArchon Sep 17, 2025
3e9ff2a
fix: tests
SkArchon Sep 17, 2025
eaf3c13
Merge branch 'main' into milinda/eng-8149-jwk-refreshunknownkid-causi…
SkArchon Sep 17, 2025
6978e0d
fix: tests
SkArchon Sep 18, 2025
dac1b99
Merge branch 'main' into milinda/eng-8149-jwk-refreshunknownkid-causi…
SkArchon Sep 18, 2025
c45b3be
Merge branch 'main' into milinda/eng-8149-jwk-refreshunknownkid-causi…
SkArchon Sep 18, 2025
a04b953
fix: make rate limit values configurable
SkArchon Sep 21, 2025
74ac0c5
fix: changes
SkArchon Sep 21, 2025
fd38a25
fix: tests
SkArchon Sep 21, 2025
24025e4
fix: default values and the comments
SkArchon Sep 22, 2025
2a3c31d
feat: allow algorithm be unspecified in jwks
SkArchon Sep 17, 2025
c4aa09e
fix: current
SkArchon Sep 17, 2025
62e7023
fix: updates
SkArchon Sep 17, 2025
7ed09a8
fix: cleanup
SkArchon Sep 17, 2025
2ac5999
fix: add schema
SkArchon Sep 17, 2025
47816e2
fix: refactoring
SkArchon Sep 17, 2025
3974969
fix: refactor comment
SkArchon Sep 17, 2025
3b93c05
fix: bug resolving
SkArchon Sep 17, 2025
fb6a32e
fix: review comments
SkArchon Sep 17, 2025
cea65d4
fix: audience
SkArchon Sep 17, 2025
c28dd2b
fix: initial validation store unit test
SkArchon Sep 18, 2025
c2e55b6
fix: compilation
SkArchon Sep 18, 2025
c7ca05c
fix: update validation store unit tests
SkArchon Sep 18, 2025
b81cd3c
fix: test cleanup
SkArchon Sep 18, 2025
747e23a
fix: cleanup
SkArchon Sep 18, 2025
482d572
fix: cleanup validation store
SkArchon Sep 22, 2025
1d571d0
fix: cleanup
SkArchon Sep 22, 2025
b45a263
fix: cleanup
SkArchon Sep 22, 2025
eda41f5
fix: cleanup
SkArchon Sep 22, 2025
ab80adb
fix: external dependency
SkArchon Sep 22, 2025
b3a4a4a
fix: go mod tidy
SkArchon Sep 22, 2025
8b4f77c
fix: update dependency
SkArchon Sep 22, 2025
4ec706d
fix: tests
SkArchon Sep 22, 2025
6c6b130
fix: tests
SkArchon Sep 22, 2025
04e1449
fix: schema
SkArchon Sep 22, 2025
2ff8405
fix: add tests
SkArchon Sep 23, 2025
8d767c4
fix: tests
SkArchon Sep 23, 2025
9cc810a
fix: updates
SkArchon Sep 30, 2025
688c884
Merge remote-tracking branch 'origin/main' into milinda/eng-8150-jwk-…
SkArchon Sep 30, 2025
a2d6bae
fix: comments
SkArchon Oct 1, 2025
25bad88
fix: using continue
SkArchon Oct 1, 2025
0c3286f
fix: tests
SkArchon Oct 1, 2025
113a61f
fix: tests
SkArchon Oct 1, 2025
59323d9
fix: go.mod updates
SkArchon Oct 1, 2025
54ad4f3
fix: imports
SkArchon Oct 1, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
515 changes: 510 additions & 5 deletions router-tests/authentication_test.go

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions router-tests/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module github.com/wundergraph/cosmo/router-tests
go 1.25

require (
github.com/MicahParks/jwkset v0.9.0
github.com/MicahParks/jwkset v0.11.0
github.com/buger/jsonparser v1.1.1
github.com/cloudflare/backoff v0.0.0-20240920015135-e46b80a3a7d0
github.com/golang-jwt/jwt/v5 v5.2.2
Expand Down Expand Up @@ -45,7 +45,6 @@ require (
connectrpc.com/connect v1.16.2 // indirect
github.com/99designs/gqlgen v0.17.76 // indirect
github.com/KimMachineGun/automemlimit v0.6.1 // indirect
github.com/MicahParks/keyfunc/v3 v3.3.5 // indirect
github.com/agnivade/levenshtein v1.2.1 // indirect
github.com/andybalholm/brotli v1.1.0 // indirect
github.com/bahlo/generic-list-go v0.2.0 // indirect
Expand Down Expand Up @@ -151,6 +150,7 @@ require (
github.com/vbatts/tar-split v0.12.1 // indirect
github.com/vektah/gqlparser/v2 v2.5.30 // indirect
github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
github.com/wundergraph/keyfunc/v3 v3.0.0-20250922133930-92f21becf3d9 // indirect
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
Expand Down
8 changes: 4 additions & 4 deletions router-tests/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,8 @@ github.com/99designs/gqlgen v0.17.76/go.mod h1:miiU+PkAnTIDKMQ1BseUOIVeQHoiwYDZG
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/KimMachineGun/automemlimit v0.6.1 h1:ILa9j1onAAMadBsyyUJv5cack8Y1WT26yLj/V+ulKp8=
github.com/KimMachineGun/automemlimit v0.6.1/go.mod h1:T7xYht7B8r6AG/AqFcUdc7fzd2bIdBKmepfP2S1svPY=
github.com/MicahParks/jwkset v0.9.0 h1:xDlGu6mZJdJ+mgAI4mIRqWm2p8Vrx0U98LMgRObw46M=
github.com/MicahParks/jwkset v0.9.0/go.mod h1:fVrj6TmG1aKlJEeceAz7JsXGTXEn72zP1px3us53JrA=
github.com/MicahParks/keyfunc/v3 v3.3.5 h1:7ceAJLUAldnoueHDNzF8Bx06oVcQ5CfJnYwNt1U3YYo=
github.com/MicahParks/keyfunc/v3 v3.3.5/go.mod h1:SdCCyMJn/bYqWDvARspC6nCT8Sk74MjuAY22C7dCST8=
github.com/MicahParks/jwkset v0.11.0 h1:yc0zG+jCvZpWgFDFmvs8/8jqqVBG9oyIbmBtmjOhoyQ=
github.com/MicahParks/jwkset v0.11.0/go.mod h1:U2oRhRaLgDCLjtpGL2GseNKGmZtLs/3O7p+OZaL5vo0=
github.com/PuerkitoBio/goquery v1.10.3 h1:pFYcNSqHxBD06Fpj/KsbStFRsgRATgnf3LeXiUkhzPo=
github.com/PuerkitoBio/goquery v1.10.3/go.mod h1:tMUX0zDMHXYlAQk6p35XxQMqMweEKB7iK7iLNd4RH4Y=
github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM=
Expand Down Expand Up @@ -354,6 +352,8 @@ github.com/wundergraph/consul/sdk v0.0.0-20250204115147-ed842a8fd301 h1:EzfKHQoT
github.com/wundergraph/consul/sdk v0.0.0-20250204115147-ed842a8fd301/go.mod h1:wxI0Nak5dI5RvJuzGyiEK4nZj0O9X+Aw6U0tC1wPKq0=
github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.226 h1:3g6KNCG4ydgnpZnIlCK7pmtv0FSge6ILUS5LjrNZNiI=
github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.226/go.mod h1:g1IFIylu5Fd9pKjzq0mDvpaKhEB/vkwLAIbGdX2djXU=
github.com/wundergraph/keyfunc/v3 v3.0.0-20250922133930-92f21becf3d9 h1:7bPpsPUUxy5dEnuDSy2q3PAmflxqKx9vnyaTj3TSMBo=
github.com/wundergraph/keyfunc/v3 v3.0.0-20250922133930-92f21becf3d9/go.mod h1:el0U1ewqJ/T/Urlt3wImfmuBmoQdjL5yoNQ5e/+O98M=
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4=
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=
Expand Down
2 changes: 1 addition & 1 deletion router-tests/header_set_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ func TestHeaderSetWithExpression(t *testing.T) {
authenticator, err := authentication.NewHttpHeaderAuthenticator(authOptions)
require.NoError(t, err)

token, err := authServer.TokenForKID(rsa1.KID(), map[string]any{"user_id": "TestId"})
token, err := authServer.TokenForKID(rsa1.KID(), map[string]any{"user_id": "TestId"}, false)
require.NoError(t, err)

testenv.Run(t, &testenv.Config{
Expand Down
28 changes: 25 additions & 3 deletions router-tests/jwks/jwks.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,25 +36,47 @@ func (s *Server) Close() {
s.httpServer.Close()
}

type TokenOpts struct {
AlgOverride string
}

func (s *Server) Token(claims map[string]any) (string, error) {
return s.TokenWithOpts(claims, TokenOpts{AlgOverride: ""})
}

func (s *Server) TokenWithOpts(claims map[string]any, tokenOpts TokenOpts) (string, error) {
if len(s.providers) == 0 {
return "", jwt.ErrInvalidKey
}

for kid, pr := range s.providers {
token := jwt.NewWithClaims(pr.SigningMethod(), jwt.MapClaims(claims))
method := pr.SigningMethod()
if tokenOpts.AlgOverride != "" {
method = jwt.GetSigningMethod(tokenOpts.AlgOverride)
if method == nil {
return "", fmt.Errorf("unsupported signing method: %s", tokenOpts.AlgOverride)
}
}
token := jwt.NewWithClaims(method, jwt.MapClaims(claims))
token.Header[jwkset.HeaderKID] = kid
return token.SignedString(pr.PrivateKey())
}

return "", jwt.ErrInvalidKey
}

func (s *Server) TokenForKID(kid string, claims map[string]any) (string, error) {
func (s *Server) TokenForKID(kid string, claims map[string]any, useInvalidKID bool) (string, error) {
provider, ok := s.providers[kid]
if !ok {
if useInvalidKID {
// If we don't care about the kid, use any available provider
for _, pr := range s.providers {
provider = pr
break
}
} else if !ok {
return "", jwt.ErrInvalidKey
}

token := jwt.NewWithClaims(provider.SigningMethod(), jwt.MapClaims(claims))
token.Header[jwkset.HeaderKID] = kid
return token.SignedString(provider.PrivateKey())
Expand Down
12 changes: 12 additions & 0 deletions router-tests/testenv/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,15 @@ func AwaitChannelWithCloseWithT[A any](t *testing.T, timeout time.Duration, ch <
require.Fail(t, "unable to receive message before timeout", msgAndArgs...)
}
}

func AwaitFunc(t *testing.T, timeout time.Duration, testFunction func()) {
t.Helper()

doneCh := make(chan struct{})
go func() {
defer close(doneCh)
testFunction()
}()

AwaitChannelWithT(t, timeout, doneCh, func(t *testing.T, _ struct{}) {}, "the test function timed out")
}
6 changes: 6 additions & 0 deletions router/core/supervisor_instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,12 @@ func setupAuthenticators(ctx context.Context, logger *zap.Logger, cfg *config.Co
KeyId: jwks.KeyId,

Audiences: jwks.Audiences,
RefreshUnknownKID: authentication.RefreshUnknownKIDConfig{
Enabled: jwks.RefreshUnknownKID.Enabled,
MaxWait: jwks.RefreshUnknownKID.MaxWait,
Interval: jwks.RefreshUnknownKID.Interval,
Burst: jwks.RefreshUnknownKID.Burst,
},
})
}

Expand Down
4 changes: 2 additions & 2 deletions router/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,7 @@ require (

require (
github.com/KimMachineGun/automemlimit v0.6.1
github.com/MicahParks/jwkset v0.9.0
github.com/MicahParks/keyfunc/v3 v3.3.5
github.com/MicahParks/jwkset v0.11.0
github.com/alicebob/miniredis/v2 v2.34.0
github.com/caarlos0/env/v11 v11.3.1
github.com/cep21/circuit/v4 v4.0.0
Expand All @@ -79,6 +78,7 @@ require (
github.com/santhosh-tekuri/jsonschema/v6 v6.0.1
github.com/tonglil/opentelemetry-go-datadog-propagator v0.1.3
github.com/wundergraph/astjson v0.0.0-20250106123708-be463c97e083
github.com/wundergraph/keyfunc/v3 v3.0.0-20250922133930-92f21becf3d9
Comment thread
SkArchon marked this conversation as resolved.
Outdated
go.uber.org/goleak v1.3.0
go.uber.org/ratelimit v0.3.1
golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8
Expand Down
8 changes: 4 additions & 4 deletions router/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,8 @@ github.com/99designs/gqlgen v0.17.49/go.mod h1:tC8YFVZMed81x7UJ7ORUwXF4Kn6SXuucF
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/KimMachineGun/automemlimit v0.6.1 h1:ILa9j1onAAMadBsyyUJv5cack8Y1WT26yLj/V+ulKp8=
github.com/KimMachineGun/automemlimit v0.6.1/go.mod h1:T7xYht7B8r6AG/AqFcUdc7fzd2bIdBKmepfP2S1svPY=
github.com/MicahParks/jwkset v0.9.0 h1:xDlGu6mZJdJ+mgAI4mIRqWm2p8Vrx0U98LMgRObw46M=
github.com/MicahParks/jwkset v0.9.0/go.mod h1:fVrj6TmG1aKlJEeceAz7JsXGTXEn72zP1px3us53JrA=
github.com/MicahParks/keyfunc/v3 v3.3.5 h1:7ceAJLUAldnoueHDNzF8Bx06oVcQ5CfJnYwNt1U3YYo=
github.com/MicahParks/keyfunc/v3 v3.3.5/go.mod h1:SdCCyMJn/bYqWDvARspC6nCT8Sk74MjuAY22C7dCST8=
github.com/MicahParks/jwkset v0.11.0 h1:yc0zG+jCvZpWgFDFmvs8/8jqqVBG9oyIbmBtmjOhoyQ=
github.com/MicahParks/jwkset v0.11.0/go.mod h1:U2oRhRaLgDCLjtpGL2GseNKGmZtLs/3O7p+OZaL5vo0=
github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8=
github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo=
github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302 h1:uvdUDbHQHO85qeSydJtItA4T55Pw6BtAejd0APRJOCE=
Expand Down Expand Up @@ -319,6 +317,8 @@ github.com/wundergraph/astjson v0.0.0-20250106123708-be463c97e083 h1:8/D7f8gKxTB
github.com/wundergraph/astjson v0.0.0-20250106123708-be463c97e083/go.mod h1:eOTL6acwctsN4F3b7YE+eE2t8zcJ/doLm9sZzsxxxrE=
github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.226 h1:3g6KNCG4ydgnpZnIlCK7pmtv0FSge6ILUS5LjrNZNiI=
github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.226/go.mod h1:g1IFIylu5Fd9pKjzq0mDvpaKhEB/vkwLAIbGdX2djXU=
github.com/wundergraph/keyfunc/v3 v3.0.0-20250922133930-92f21becf3d9 h1:7bPpsPUUxy5dEnuDSy2q3PAmflxqKx9vnyaTj3TSMBo=
github.com/wundergraph/keyfunc/v3 v3.0.0-20250922133930-92f21becf3d9/go.mod h1:el0U1ewqJ/T/Urlt3wImfmuBmoQdjL5yoNQ5e/+O98M=
github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=
github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4=
github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M=
Expand Down
60 changes: 38 additions & 22 deletions router/pkg/authentication/jwks_token_decoder.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,16 @@ import (
"context"
"errors"
"fmt"
"github.com/wundergraph/keyfunc/v3"
"net/http"
"time"

"github.com/MicahParks/jwkset"
"github.com/MicahParks/keyfunc/v3"
"github.com/golang-jwt/jwt/v5"
"go.uber.org/zap"
"golang.org/x/time/rate"

"github.com/MicahParks/jwkset"
"github.com/golang-jwt/jwt/v5"
"github.com/wundergraph/cosmo/router/internal/httpclient"
"go.uber.org/zap"
)

type TokenDecoder interface {
Expand Down Expand Up @@ -49,6 +49,15 @@ type JWKSConfig struct {
KeyId string

Audiences []string

RefreshUnknownKID RefreshUnknownKIDConfig
}

type RefreshUnknownKIDConfig struct {
Enabled bool
Interval time.Duration
Burst int
MaxWait time.Duration
}

type audKey struct {
Expand Down Expand Up @@ -81,7 +90,7 @@ func NewJwksTokenDecoder(ctx context.Context, logger *zap.Logger, configs []JWKS
l.Error("Failed to refresh HTTP JWK Set from remote HTTP resource.", zap.Error(err))
},
RefreshInterval: c.RefreshInterval,
Storage: NewValidationStore(logger, nil, c.AllowedAlgorithms),
Storage: jwkset.NewMemoryStorage(),
}

store, err := jwkset.NewStorageFromHTTP(c.URL, jwksetHTTPStorageOptions)
Expand All @@ -95,11 +104,16 @@ func NewJwksTokenDecoder(ctx context.Context, logger *zap.Logger, configs []JWKS
HTTPURLs: map[string]jwkset.Storage{
c.URL: store,
},
PrioritizeHTTP: true,
RefreshUnknownKID: rate.NewLimiter(rate.Every(5*time.Minute), 1),
PrioritizeHTTP: true,
}

jwks, err := createKeyFunc(ctx, jwksetHTTPClientOptions)
// Configure the rate limiter for refreshing unknown KIDs
if c.RefreshUnknownKID.Enabled {
jwksetHTTPClientOptions.RefreshUnknownKID = rate.NewLimiter(rate.Every(c.RefreshUnknownKID.Interval), c.RefreshUnknownKID.Burst)
jwksetHTTPClientOptions.RateLimitWaitMax = c.RefreshUnknownKID.MaxWait
}

jwks, err := createKeyFunc(ctx, jwksetHTTPClientOptions, c.AllowedAlgorithms)
if err != nil {
return nil, err
}
Expand All @@ -110,7 +124,6 @@ func NewJwksTokenDecoder(ctx context.Context, logger *zap.Logger, configs []JWKS
if _, ok := audiencesMap[key]; ok {
return nil, fmt.Errorf("duplicate JWK keyid specified found: %s", c.KeyId)
}

given := jwkset.NewMemoryStorage()

marshalOptions := jwkset.JWKMarshalOptions{
Expand Down Expand Up @@ -150,7 +163,7 @@ func NewJwksTokenDecoder(ctx context.Context, logger *zap.Logger, configs []JWKS
PrioritizeHTTP: false,
}

jwks, err := createKeyFunc(ctx, jwksetHTTPClientOptions)
jwks, err := createKeyFunc(ctx, jwksetHTTPClientOptions, make([]string, 0))
if err != nil {
return nil, err
}
Expand All @@ -161,22 +174,24 @@ func NewJwksTokenDecoder(ctx context.Context, logger *zap.Logger, configs []JWKS
keyFuncWrapper := jwt.Keyfunc(func(token *jwt.Token) (any, error) {
var errJoin error
for key, keyFunc := range keyFuncMap {
pub, err := keyFunc.Keyfunc(token)
if err != nil {
errJoin = errors.Join(errJoin, err)
continue
}

expectedAudiences := audiencesMap[key]
if len(expectedAudiences) > 0 {
tokenAudiences, err := token.Claims.GetAudience()
if err != nil {
return nil, fmt.Errorf("could not get audiences from token claims: %w", err)
errJoin = errors.Join(errJoin, fmt.Errorf("could not get audiences from token claims: %w", err))
Comment thread
StarpTech marked this conversation as resolved.
continue
}
if !hasAudience(tokenAudiences, expectedAudiences) {
return nil, errUnacceptableAud
errJoin = errors.Join(errJoin, errUnacceptableAud)
continue
}
}

pub, err := keyFunc.Keyfunc(token)
if err != nil {
errJoin = errors.Join(errJoin, err)
continue
}
return pub, nil
}

Expand All @@ -196,16 +211,17 @@ func getAudienceSet(audiences []string) audienceSet {
return audSet
}

func createKeyFunc(ctx context.Context, options jwkset.HTTPClientOptions) (keyfunc.Keyfunc, error) {
func createKeyFunc(ctx context.Context, options jwkset.HTTPClientOptions, algorithms []string) (keyfunc.Keyfunc, error) {
combined, err := jwkset.NewHTTPClient(options)
if err != nil {
return nil, fmt.Errorf("failed to create HTTP client storage for JWK provider: %w", err)
}

keyfuncOptions := keyfunc.Options{
Ctx: ctx,
Storage: combined,
UseWhitelist: []jwkset.USE{jwkset.UseSig},
Ctx: ctx,
Storage: combined,
UseWhitelist: []jwkset.USE{jwkset.UseSig},
AllowedAlgorithms: algorithms,
}

jwks, err := keyfunc.New(keyfuncOptions)
Expand Down
Loading