@@ -88,35 +88,36 @@ type OAuthProxy struct {
88 AuthOnlyPath string
88 AuthOnlyPath string
89 UserInfoPath string
89 UserInfoPath string
91− redirectURL *url.URL // the url to receive requests at
91+ redirectURL *url.URL // the url to receive requests at
92− whitelistDomains []string
92+ whitelistDomains []string
93− provider providers.Provider
93+ provider providers.Provider
94− providerNameOverride string
94+ providerNameOverride string
95− sessionStore sessionsapi.SessionStore
95+ sessionStore sessionsapi.SessionStore
96− ProxyPrefix string
96+ ProxyPrefix string
97− SignInMessage string
97+ SignInMessage string
98− HtpasswdFile *HtpasswdFile
98+ HtpasswdFile *HtpasswdFile
99− DisplayHtpasswdForm bool
99+ DisplayHtpasswdForm bool
100− serveMux http.Handler
100+ serveMux http.Handler
101− SetXAuthRequest bool
101+ SetXAuthRequest bool
102− PassBasicAuth bool
102+ PassBasicAuth bool
103− SetBasicAuth bool
103+ SetBasicAuth bool
104− SkipProviderButton bool
104+ SkipProviderButton bool
105− PassUserHeaders bool
105+ PassUserHeaders bool
106− BasicAuthPassword string
106+ BasicAuthPassword string
107− PassAccessToken bool
107+ PassAccessToken bool
108− SetAuthorization bool
108+ SetAuthorization bool
109− PassAuthorization bool
109+ PassAuthorization bool
110− PreferEmailToUser bool
110+ PreferEmailToUser bool
111− skipAuthRegex []string
111+ skipAuthRegex []string
112− skipAuthPreflight bool
112+ skipAuthPreflight bool
113− skipJwtBearerTokens bool
113+ skipJwtBearerTokens bool
114+ mainJwtBearerVerifier *oidc.IDTokenVerifier
114− jwtBearerVerifiers []*oidc.IDTokenVerifier
115+ extraJwtBearerVerifiers []*oidc.IDTokenVerifier
115− compiledRegex []*regexp.Regexp
116+ compiledRegex []*regexp.Regexp
116− templates *template.Template
117+ templates *template.Template
117− realClientIPParser ipapi.RealClientIPParser
118+ realClientIPParser ipapi.RealClientIPParser
118− Banner string
119+ Banner string
119− Footer string
120+ Footer string
122// UpstreamProxy represents an upstream server to proxy to
123// UpstreamProxy represents an upstream server to proxy to
@@ -317,32 +318,33 @@ func NewOAuthProxy(opts *options.Options, validator func(string) bool) *OAuthPro
317 AuthOnlyPath: fmt.Sprintf("%s/auth", opts.ProxyPrefix),
318 AuthOnlyPath: fmt.Sprintf("%s/auth", opts.ProxyPrefix),
318 UserInfoPath: fmt.Sprintf("%s/userinfo", opts.ProxyPrefix),
319 UserInfoPath: fmt.Sprintf("%s/userinfo", opts.ProxyPrefix),
320− ProxyPrefix: opts.ProxyPrefix,
321+ ProxyPrefix: opts.ProxyPrefix,
321− provider: opts.GetProvider(),
322+ provider: opts.GetProvider(),
322− providerNameOverride: opts.ProviderName,
323+ providerNameOverride: opts.ProviderName,
323− sessionStore: opts.GetSessionStore(),
324+ sessionStore: opts.GetSessionStore(),
324− serveMux: serveMux,
325+ serveMux: serveMux,
325− redirectURL: redirectURL,
326+ redirectURL: redirectURL,
326− whitelistDomains: opts.WhitelistDomains,
327+ whitelistDomains: opts.WhitelistDomains,
327− skipAuthRegex: opts.SkipAuthRegex,
328+ skipAuthRegex: opts.SkipAuthRegex,
328− skipAuthPreflight: opts.SkipAuthPreflight,
329+ skipAuthPreflight: opts.SkipAuthPreflight,
329− skipJwtBearerTokens: opts.SkipJwtBearerTokens,
330+ skipJwtBearerTokens: opts.SkipJwtBearerTokens,
331+ mainJwtBearerVerifier: opts.GetOIDCVerifier(),
330− jwtBearerVerifiers: opts.GetJWTBearerVerifiers(),
332+ extraJwtBearerVerifiers: opts.GetJWTBearerVerifiers(),
331− compiledRegex: opts.GetCompiledRegex(),
333+ compiledRegex: opts.GetCompiledRegex(),
332− realClientIPParser: opts.GetRealClientIPParser(),
334+ realClientIPParser: opts.GetRealClientIPParser(),
333− SetXAuthRequest: opts.SetXAuthRequest,
335+ SetXAuthRequest: opts.SetXAuthRequest,
334− PassBasicAuth: opts.PassBasicAuth,
336+ PassBasicAuth: opts.PassBasicAuth,
335− SetBasicAuth: opts.SetBasicAuth,
337+ SetBasicAuth: opts.SetBasicAuth,
336− PassUserHeaders: opts.PassUserHeaders,
338+ PassUserHeaders: opts.PassUserHeaders,
337− BasicAuthPassword: opts.BasicAuthPassword,
339+ BasicAuthPassword: opts.BasicAuthPassword,
338− PassAccessToken: opts.PassAccessToken,
340+ PassAccessToken: opts.PassAccessToken,
339− SetAuthorization: opts.SetAuthorization,
341+ SetAuthorization: opts.SetAuthorization,
340− PassAuthorization: opts.PassAuthorization,
342+ PassAuthorization: opts.PassAuthorization,
341− PreferEmailToUser: opts.PreferEmailToUser,
343+ PreferEmailToUser: opts.PreferEmailToUser,
342− SkipProviderButton: opts.SkipProviderButton,
344+ SkipProviderButton: opts.SkipProviderButton,
343− templates: loadTemplates(opts.CustomTemplatesDir),
345+ templates: loadTemplates(opts.CustomTemplatesDir),
344− Banner: opts.Banner,
346+ Banner: opts.Banner,
345− Footer: opts.Footer,
347+ Footer: opts.Footer,
@@ -1139,15 +1141,24 @@ func (p *OAuthProxy) GetJwtSession(req *http.Request) (*sessionsapi.SessionState
1139 return nil, err
1141 return nil, err
1142− for _, verifier := range p.jwtBearerVerifiers {
1144+ // If we are using an oidc provider, go ahead and try that provider first with its Verifier
1145+ // and Bearer Token -> Session converter
1146+ if p.mainJwtBearerVerifier != nil {
1143− bearerToken, err := verifier.Verify(req.Context(), rawBearerToken)
1147+ bearerToken, err := p.mainJwtBearerVerifier.Verify(req.Context(), rawBearerToken)
1149+ return p.provider.CreateSessionStateFromBearerToken(req.Context(), rawBearerToken, bearerToken)
1153+ // Otherwise, attempt to verify against the extra JWT issuers and use a more generic
1154+ // Bearer Token -> Session converter
1155+ for _, verifier := range p.extraJwtBearerVerifiers {
1156+ bearerToken, err := verifier.Verify(req.Context(), rawBearerToken)
1145 if err != nil {
1157 if err != nil {
1146− logger.Printf("failed to verify bearer token: %v", err)
1147 continue
1158 continue
1150− return p.provider.CreateSessionStateFromBearerToken(req.Context(), rawBearerToken, bearerToken)
1161+ return (*providers.ProviderData)(nil).CreateSessionStateFromBearerToken(req.Context(), rawBearerToken, bearerToken)
1152 return nil, fmt.Errorf("unable to verify jwt token %s", req.Header.Get("Authorization"))
1163 return nil, fmt.Errorf("unable to verify jwt token %s", req.Header.Get("Authorization"))