@@ -8,13 +8,11 @@ import (
88 "net/url"
99 "strings"
1010
11− "github.com/coreos/go-oidc/v3/oidc"
1211 "github.com/mbland/hmacauth"
1312 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/options"
1413 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/ip"
1514 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/logger"
1615 internaloidc "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/providers/oidc"
17− "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/requests"
1816 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/util"
1917)
2018
@@ -148,32 +146,27 @@ func parseJwtIssuers(issuers []string, msgs []string) ([]jwtIssuer, []string) {
148146
149147// newVerifierFromJwtIssuer takes in issuer information in jwtIssuer info and returns
150148// a verifier for that issuer.
151−func newVerifierFromJwtIssuer(audienceClaims []string, extraAudiences []string, jwtIssuer jwtIssuer) (*internaloidc.IDTokenVerifier, error) {
152− config := &oidc.Config{
153− ClientID: jwtIssuer.audience,
154− SkipClientIDCheck: true, // client id check is done within oauth2-proxy: IDTokenVerifier.Verify
155− }
156− // Try as an OpenID Connect Provider first
157− var verifier *oidc.IDTokenVerifier
158− provider, err := oidc.NewProvider(context.Background(), jwtIssuer.issuerURI)
159− if err != nil {
160− // Try as JWKS URI
161− jwksURI := strings.TrimSuffix(jwtIssuer.issuerURI, "/") + "/.well-known/jwks.json"
162− if err := requests.New(jwksURI).Do().Error(); err != nil {
163− return nil, err
164− }
165−
166− verifier = oidc.NewVerifier(jwtIssuer.issuerURI, oidc.NewRemoteKeySet(context.Background(), jwksURI), config)
167− } else {
168− verifier = provider.Verifier(config)
169− }
170− verificationOptions := &internaloidc.IDTokenVerificationOptions{
149+func newVerifierFromJwtIssuer(audienceClaims []string, extraAudiences []string, jwtIssuer jwtIssuer) (internaloidc.IDTokenVerifier, error) {
150+ pvOpts := internaloidc.ProviderVerifierOptions{
171151 AudienceClaims: audienceClaims,
172152 ClientID: jwtIssuer.audience,
173153 ExtraAudiences: extraAudiences,
174− // ExtraAudiences: o.Providers[0].OIDCConfig.ExtraAudiences,
154+ IssuerURL: jwtIssuer.issuerURI,
155+ }
156+
157+ pv, err := internaloidc.NewProviderVerifier(context.TODO(), pvOpts)
158+ if err != nil {
159+ // If the discovery didn't work, try again without discovery
160+ pvOpts.JWKsURL = strings.TrimSuffix(jwtIssuer.issuerURI, "/") + "/.well-known/jwks.json"
161+ pvOpts.SkipDiscovery = true
162+
163+ pv, err = internaloidc.NewProviderVerifier(context.TODO(), pvOpts)
164+ if err != nil {
165+ return nil, fmt.Errorf("could not construct provider verifier for JWT Issuer: %v", err)
166+ }
175167 }
176− return internaloidc.NewVerifier(verifier, verificationOptions), nil
168+
169+ return pv.Verifier(), nil
177170}
178171
179172// jwtIssuer hold parsed JWT issuer info that's used to construct a verifier.