Use JwtIssuer struct when parsing
This commit is contained in:
parent
58b06ce761
commit
350c1cd127
68
options.go
68
options.go
@ -119,7 +119,6 @@ type Options struct {
|
|||||||
sessionStore sessionsapi.SessionStore
|
sessionStore sessionsapi.SessionStore
|
||||||
signatureData *SignatureData
|
signatureData *SignatureData
|
||||||
oidcVerifier *oidc.IDTokenVerifier
|
oidcVerifier *oidc.IDTokenVerifier
|
||||||
jwtIssuers [][]string
|
|
||||||
jwtBearerVerifiers []*oidc.IDTokenVerifier
|
jwtBearerVerifiers []*oidc.IDTokenVerifier
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,6 +171,12 @@ func NewOptions() *Options {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// JwtIssuer hold parsed JWT issuer info that's used to construct a verifier.
|
||||||
|
type JwtIssuer struct {
|
||||||
|
issuerURI string
|
||||||
|
audience string
|
||||||
|
}
|
||||||
|
|
||||||
func parseURL(toParse string, urltype string, msgs []string) (*url.URL, []string) {
|
func parseURL(toParse string, urltype string, msgs []string) (*url.URL, []string) {
|
||||||
parsed, err := url.Parse(toParse)
|
parsed, err := url.Parse(toParse)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -255,25 +260,12 @@ func (o *Options) Validate() error {
|
|||||||
}
|
}
|
||||||
// Configure extra issuers
|
// Configure extra issuers
|
||||||
if len(o.ExtraJwtIssuers) > 0 {
|
if len(o.ExtraJwtIssuers) > 0 {
|
||||||
msgs = parseJwtIssuers(o, msgs)
|
var jwtIssuers []JwtIssuer
|
||||||
for _, pair := range o.jwtIssuers {
|
jwtIssuers, msgs = parseJwtIssuers(o.ExtraJwtIssuers, msgs)
|
||||||
issuer, audience := pair[0], pair[1]
|
for _, jwtIssuer := range jwtIssuers {
|
||||||
config := &oidc.Config{
|
verifier, err := newVerifierFromJwtIssuer(jwtIssuer)
|
||||||
ClientID: audience,
|
|
||||||
}
|
|
||||||
// Try as an OpenID Connect Provider first
|
|
||||||
var verifier *oidc.IDTokenVerifier
|
|
||||||
provider, err := oidc.NewProvider(context.Background(), issuer)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Try as JWKS URI
|
msgs = append(msgs, fmt.Sprintf("error building verifiers: %s", err))
|
||||||
jwksURI := strings.TrimSuffix(issuer, "/") + "/.well-known/jwks.json"
|
|
||||||
_, err := http.NewRequest("GET", jwksURI, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
verifier = oidc.NewVerifier(issuer, oidc.NewRemoteKeySet(context.Background(), jwksURI), config)
|
|
||||||
} else {
|
|
||||||
verifier = provider.Verifier(config)
|
|
||||||
}
|
}
|
||||||
o.jwtBearerVerifiers = append(o.jwtBearerVerifiers, verifier)
|
o.jwtBearerVerifiers = append(o.jwtBearerVerifiers, verifier)
|
||||||
}
|
}
|
||||||
@ -466,17 +458,43 @@ func parseSignatureKey(o *Options, msgs []string) []string {
|
|||||||
return msgs
|
return msgs
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseJwtIssuers(o *Options, msgs []string) []string {
|
// parseJwtIssuers takes in an array of strings in the form of issuer=audience
|
||||||
for _, jwtVerifier := range o.ExtraJwtIssuers {
|
// and parses to an array of JwtIssuer structs.
|
||||||
|
func parseJwtIssuers(issuers []string, msgs []string) ([]JwtIssuer, []string) {
|
||||||
|
var parsedIssuers []JwtIssuer
|
||||||
|
for _, jwtVerifier := range issuers {
|
||||||
components := strings.Split(jwtVerifier, "=")
|
components := strings.Split(jwtVerifier, "=")
|
||||||
if len(components) < 2 {
|
if len(components) < 2 {
|
||||||
return append(msgs, "invalid jwt verifier uri=audience spec: "+
|
msgs = append(msgs, fmt.Sprintf("invalid jwt verifier uri=audience spec: %s", jwtVerifier))
|
||||||
jwtVerifier)
|
continue
|
||||||
}
|
}
|
||||||
uri, audience := components[0], strings.Join(components[1:], "=")
|
uri, audience := components[0], strings.Join(components[1:], "=")
|
||||||
o.jwtIssuers = append(o.jwtIssuers, []string{uri, audience})
|
parsedIssuers = append(parsedIssuers, JwtIssuer{issuerURI: uri, audience: audience})
|
||||||
}
|
}
|
||||||
return msgs
|
return parsedIssuers, msgs
|
||||||
|
}
|
||||||
|
|
||||||
|
// newVerifierFromJwtIssuer takes in issuer information in JwtIssuer info and returns
|
||||||
|
// a verifier for that issuer.
|
||||||
|
func newVerifierFromJwtIssuer(jwtIssuer JwtIssuer) (*oidc.IDTokenVerifier, error) {
|
||||||
|
config := &oidc.Config{
|
||||||
|
ClientID: jwtIssuer.audience,
|
||||||
|
}
|
||||||
|
// Try as an OpenID Connect Provider first
|
||||||
|
var verifier *oidc.IDTokenVerifier
|
||||||
|
provider, err := oidc.NewProvider(context.Background(), jwtIssuer.issuerURI)
|
||||||
|
if err != nil {
|
||||||
|
// Try as JWKS URI
|
||||||
|
jwksURI := strings.TrimSuffix(jwtIssuer.issuerURI, "/") + "/.well-known/jwks.json"
|
||||||
|
_, err := http.NewRequest("GET", jwksURI, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
verifier = oidc.NewVerifier(jwtIssuer.issuerURI, oidc.NewRemoteKeySet(context.Background(), jwksURI), config)
|
||||||
|
} else {
|
||||||
|
verifier = provider.Verifier(config)
|
||||||
|
}
|
||||||
|
return verifier, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func validateCookieName(o *Options, msgs []string) []string {
|
func validateCookieName(o *Options, msgs []string) []string {
|
||||||
|
Loading…
Reference in New Issue
Block a user