Skip to content

Commit bacdbd8

Browse files
committed
oauthserver: preserve headers used by RequestHeaderIdentityProvider
1 parent 8a6f3a1 commit bacdbd8

File tree

2 files changed

+44
-15
lines changed

2 files changed

+44
-15
lines changed

pkg/oauthserver/oauth_apiserver.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -345,15 +345,14 @@ func (c *OAuthServerConfig) buildHandlerChainForOAuth(startingHandler http.Handl
345345
panic(err)
346346
}
347347

348-
// add back the Authorization header so that WithOAuth can use it even after WithAuthentication deletes it
349-
// WithOAuth sees users' passwords and can mint tokens so this is not really an issue
350-
handler = headers.WithRestoreAuthorizationHeader(handler)
348+
// restore the Authorization and any extra provider headers
349+
handler = headers.WithRestoreOAuthHeaders(handler, c.ExtraOAuthConfig.Options)
351350

352351
// this is the normal kube handler chain
353352
handler = genericapiserver.DefaultBuildHandlerChain(handler, genericConfig)
354353

355-
// store a copy of the Authorization header for later use
356-
handler = headers.WithPreserveAuthorizationHeader(handler)
354+
// store a copy of the Authorization and any extra provider headers for later use
355+
handler = headers.WithPreserveOAuthHeaders(handler, c.ExtraOAuthConfig.Options)
357356

358357
// protected endpoints should not be cached
359358
handler = headers.WithStandardHeaders(handler)

pkg/server/headers/oauthbasic.go

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,57 @@
11
package headers
22

3-
import "net/http"
3+
import (
4+
"net/http"
5+
6+
osinv1 "github.com/openshift/api/osin/v1"
7+
)
48

59
const (
6-
authzHeader = "Authorization"
7-
copyAuthzHeader = "oauth.openshift.io:" + authzHeader // will never conflict because : is not a valid header key
10+
authzHeader = "Authorization"
11+
headerCopyPrefix = "oauth.openshift.io:" // will never conflict because : is not a valid header key
812
)
913

10-
func WithPreserveAuthorizationHeader(handler http.Handler) http.Handler {
14+
func preservedHeaders(oauthConfig *osinv1.OAuthConfig) []string {
15+
// compile a list of headers that should be preserved lest any handler in the kube chain deletes them
16+
// so that WithOAuth can use them even after WithAuthentication deletes them
17+
// WithOAuth sees users' passwords and can mint tokens so this is not really an issue
18+
preservedHeaders := make([]string, 0)
19+
for _, identityProvider := range oauthConfig.IdentityProviders {
20+
switch provider := identityProvider.Provider.Object.(type) {
21+
case *osinv1.RequestHeaderIdentityProvider:
22+
preservedHeaders = append(preservedHeaders, provider.Headers...)
23+
preservedHeaders = append(preservedHeaders, provider.PreferredUsernameHeaders...)
24+
preservedHeaders = append(preservedHeaders, provider.NameHeaders...)
25+
preservedHeaders = append(preservedHeaders, provider.EmailHeaders...)
26+
}
27+
}
28+
29+
return preservedHeaders
30+
}
31+
32+
func WithPreserveOAuthHeaders(handler http.Handler, oauthConfig osinv1.OAuthConfig) http.Handler {
33+
headers := append(preservedHeaders(&oauthConfig), authzHeader)
1134
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
12-
if vv, ok := r.Header[authzHeader]; ok {
13-
r.Header[copyAuthzHeader] = vv // capture the values before they are deleted
35+
for _, header := range headers {
36+
if vv, ok := r.Header[header]; ok {
37+
headerCopy := headerCopyPrefix + header
38+
r.Header[headerCopy] = vv // capture the values before they are deleted
39+
}
1440
}
1541

1642
handler.ServeHTTP(w, r)
1743
})
1844
}
1945

20-
func WithRestoreAuthorizationHeader(handler http.Handler) http.Handler {
46+
func WithRestoreOAuthHeaders(handler http.Handler, oauthConfig osinv1.OAuthConfig) http.Handler {
47+
headers := append(preservedHeaders(&oauthConfig), authzHeader)
2148
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
22-
if vv, ok := r.Header[copyAuthzHeader]; ok {
23-
r.Header[authzHeader] = vv // add them back afterwards for use in OAuth flows
24-
delete(r.Header, copyAuthzHeader)
49+
for _, header := range headers {
50+
headerCopy := headerCopyPrefix + header
51+
if vv, ok := r.Header[headerCopy]; ok {
52+
r.Header[header] = vv // add them back afterwards for use in OAuth flows
53+
delete(r.Header, headerCopy)
54+
}
2555
}
2656

2757
handler.ServeHTTP(w, r)

0 commit comments

Comments
 (0)