9
9
"fmt"
10
10
"io"
11
11
"net/http"
12
+ "slices"
12
13
"strings"
13
14
"time"
14
15
@@ -50,9 +51,10 @@ type KeySet interface {
50
51
51
52
// IDTokenVerifier provides verification for ID Tokens.
52
53
type IDTokenVerifier struct {
53
- keySet KeySet
54
- config * Config
55
- issuer string
54
+ keySet KeySet
55
+ config * Config
56
+ issuer string
57
+ alternativeIssuer []string
56
58
}
57
59
58
60
// NewVerifier returns a verifier manually constructed from a key set and issuer URL.
@@ -71,8 +73,8 @@ type IDTokenVerifier struct {
71
73
//
72
74
// keySet := &oidc.StaticKeySet{PublicKeys: []crypto.PublicKey{pub1, pub2}}
73
75
// verifier := oidc.NewVerifier("https://accounts.google.com", keySet, config)
74
- func NewVerifier (issuerURL string , keySet KeySet , config * Config ) * IDTokenVerifier {
75
- return & IDTokenVerifier {keySet : keySet , config : config , issuer : issuerURL }
76
+ func NewVerifier (issuerURL string , keySet KeySet , config * Config , alternativeIssuer ... string ) * IDTokenVerifier {
77
+ return & IDTokenVerifier {keySet : keySet , config : config , issuer : issuerURL , alternativeIssuer : alternativeIssuer }
76
78
}
77
79
78
80
// Config is the configuration for an IDTokenVerifier.
@@ -142,7 +144,7 @@ func (p *Provider) newVerifier(keySet KeySet, config *Config) *IDTokenVerifier {
142
144
cp .SupportedSigningAlgs = p .algorithms
143
145
config = cp
144
146
}
145
- return NewVerifier (p .issuer , keySet , config )
147
+ return NewVerifier (p .issuer , keySet , config , p . alternativeIssuer ... )
146
148
}
147
149
148
150
func parseJWT (p string ) ([]byte , error ) {
@@ -257,14 +259,16 @@ func (v *IDTokenVerifier) Verify(ctx context.Context, rawIDToken string) (*IDTok
257
259
}
258
260
259
261
// Check issuer.
260
- if ! v .config .SkipIssuerCheck && t .Issuer != v .issuer {
262
+ v .alternativeIssuer = append (v .alternativeIssuer , v .issuer )
263
+
264
+ if ! v .config .SkipIssuerCheck && ! slices .Contains (v .alternativeIssuer , t .Issuer ) {
261
265
// Google sometimes returns "accounts.google.com" as the issuer claim instead of
262
266
// the required "https://accounts.google.com". Detect this case and allow it only
263
267
// for Google.
264
268
//
265
269
// We will not add hooks to let other providers go off spec like this.
266
270
if ! (v .issuer == issuerGoogleAccounts && t .Issuer == issuerGoogleAccountsNoScheme ) {
267
- return nil , fmt .Errorf ("oidc: id token issued by a different provider, expected %q got %q" , v .issuer , t .Issuer )
271
+ return nil , fmt .Errorf ("oidc: id token issued by a different provider, expected one of %v got %q" , v .alternativeIssuer , t .Issuer )
268
272
}
269
273
}
270
274
0 commit comments