Session aware logout, backend logout url approach
This commit is contained in:
parent
99bafcff95
commit
1b4c3d756e
|
|
@ -22,6 +22,7 @@
|
|||
- [#2282](https://github.com/oauth2-proxy/oauth2-proxy/pull/2282) Fixed checking Google Groups membership using Google Application Credentials (@kvanzuijlen)
|
||||
- [#2183](https://github.com/oauth2-proxy/oauth2-proxy/pull/2183) Allowing relative redirect url though an option (@axel7083)
|
||||
- [#1866](https://github.com/oauth2-proxy/oauth2-proxy/pull/1866) Add support for unix socker as upstream (@babs)
|
||||
- [#1876](https://github.com/oauth2-proxy/oauth2-proxy/pull/1876) Add `--backend-logout-url` with `{id_token}` placeholder (@babs)
|
||||
- [#1949](https://github.com/oauth2-proxy/oauth2-proxy/pull/1949) Allow cookie names with dots in redis sessions (@miguelborges99)
|
||||
- [#2297](https://github.com/oauth2-proxy/oauth2-proxy/pull/2297) Add nightly build and push (@tuunit)
|
||||
- [#2329](https://github.com/oauth2-proxy/oauth2-proxy/pull/2329) Add an option to skip request to profile URL for resolving missing claims in id_token (@nilsgstrabo)
|
||||
|
|
|
|||
|
|
@ -348,15 +348,15 @@ func (p *OAuthProxy) buildProxySubrouter(s *mux.Router) {
|
|||
s.Use(prepareNoCacheMiddleware)
|
||||
|
||||
s.Path(signInPath).HandlerFunc(p.SignIn)
|
||||
s.Path(signOutPath).HandlerFunc(p.SignOut)
|
||||
s.Path(oauthStartPath).HandlerFunc(p.OAuthStart)
|
||||
s.Path(oauthCallbackPath).HandlerFunc(p.OAuthCallback)
|
||||
|
||||
// Static file paths
|
||||
s.PathPrefix(staticPathPrefix).Handler(http.StripPrefix(p.ProxyPrefix, http.FileServer(http.FS(staticFiles))))
|
||||
|
||||
// The userinfo endpoint needs to load sessions before handling the request
|
||||
// The userinfo and logout endpoints needs to load sessions before handling the request
|
||||
s.Path(userInfoPath).Handler(p.sessionChain.ThenFunc(p.UserInfo))
|
||||
s.Path(signOutPath).Handler(p.sessionChain.ThenFunc(p.SignOut))
|
||||
}
|
||||
|
||||
// buildPreAuthChain constructs a chain that should process every request before
|
||||
|
|
@ -769,9 +769,43 @@ func (p *OAuthProxy) SignOut(rw http.ResponseWriter, req *http.Request) {
|
|||
p.ErrorPage(rw, req, http.StatusInternalServerError, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
p.backendLogout(rw, req)
|
||||
|
||||
http.Redirect(rw, req, redirect, http.StatusFound)
|
||||
}
|
||||
|
||||
func (p *OAuthProxy) backendLogout(rw http.ResponseWriter, req *http.Request) {
|
||||
session, err := p.getAuthenticatedSession(rw, req)
|
||||
if err != nil {
|
||||
logger.Errorf("error getting authenticated session during backend logout: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
if session == nil {
|
||||
return
|
||||
}
|
||||
|
||||
providerData := p.provider.Data()
|
||||
if providerData.BackendLogoutURL == "" {
|
||||
return
|
||||
}
|
||||
|
||||
backendLogoutURL := strings.ReplaceAll(providerData.BackendLogoutURL, "{id_token}", session.IDToken)
|
||||
// security exception because URL is dynamic ({id_token} replacement) but
|
||||
// base is not end-user provided but comes from configuration somewhat secure
|
||||
resp, err := http.Get(backendLogoutURL) // #nosec G107
|
||||
if err != nil {
|
||||
logger.Errorf("error while calling backend logout: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
defer resp.Body.Close()
|
||||
if resp.StatusCode != 200 {
|
||||
logger.Errorf("error while calling backend logout url, returned error code %v", resp.StatusCode)
|
||||
}
|
||||
}
|
||||
|
||||
// OAuthStart starts the OAuth2 authentication flow
|
||||
func (p *OAuthProxy) OAuthStart(rw http.ResponseWriter, req *http.Request) {
|
||||
// start the flow permitting login URL query parameters to be overridden from the request URL
|
||||
|
|
|
|||
|
|
@ -567,6 +567,7 @@ type LegacyProvider struct {
|
|||
UserIDClaim string `flag:"user-id-claim" cfg:"user_id_claim"`
|
||||
AllowedGroups []string `flag:"allowed-group" cfg:"allowed_groups"`
|
||||
AllowedRoles []string `flag:"allowed-role" cfg:"allowed_roles"`
|
||||
BackendLogoutURL string `flag:"backend-logout-url" cfg:"backend_logout_url"`
|
||||
|
||||
AcrValues string `flag:"acr-values" cfg:"acr_values"`
|
||||
JWTKey string `flag:"jwt-key" cfg:"jwt_key"`
|
||||
|
|
@ -635,6 +636,7 @@ func legacyProviderFlagSet() *pflag.FlagSet {
|
|||
flagSet.String("user-id-claim", OIDCEmailClaim, "(DEPRECATED for `oidc-email-claim`) which claim contains the user ID")
|
||||
flagSet.StringSlice("allowed-group", []string{}, "restrict logins to members of this group (may be given multiple times)")
|
||||
flagSet.StringSlice("allowed-role", []string{}, "(keycloak-oidc) restrict logins to members of these roles (may be given multiple times)")
|
||||
flagSet.String("backend-logout-url", "", "url to perform a backend logout, {id_token} can be used as placeholder for the id_token")
|
||||
|
||||
return flagSet
|
||||
}
|
||||
|
|
@ -714,6 +716,7 @@ func (l *LegacyProvider) convert() (Providers, error) {
|
|||
Scope: l.Scope,
|
||||
AllowedGroups: l.AllowedGroups,
|
||||
CodeChallengeMethod: l.CodeChallengeMethod,
|
||||
BackendLogoutURL: l.BackendLogoutURL,
|
||||
}
|
||||
|
||||
// This part is out of the switch section for all providers that support OIDC
|
||||
|
|
|
|||
|
|
@ -85,6 +85,8 @@ type Provider struct {
|
|||
AllowedGroups []string `json:"allowedGroups,omitempty"`
|
||||
// The code challenge method
|
||||
CodeChallengeMethod string `json:"code_challenge_method,omitempty"`
|
||||
// URL to call to perform backend logout, `{id_token}` would be replaced by the actual `id_token` if available in the session
|
||||
BackendLogoutURL string `json:"backendLogoutURL"`
|
||||
}
|
||||
|
||||
// ProviderType is used to enumerate the different provider type options
|
||||
|
|
|
|||
|
|
@ -58,6 +58,8 @@ type ProviderData struct {
|
|||
getAuthorizationHeaderFunc func(string) http.Header
|
||||
loginURLParameterDefaults url.Values
|
||||
loginURLParameterOverrides map[string]*regexp.Regexp
|
||||
|
||||
BackendLogoutURL string
|
||||
}
|
||||
|
||||
// Data returns the ProviderData
|
||||
|
|
|
|||
|
|
@ -160,6 +160,7 @@ func newProviderDataFromConfig(providerConfig options.Provider) (*ProviderData,
|
|||
}
|
||||
|
||||
p.setAllowedGroups(providerConfig.AllowedGroups)
|
||||
p.BackendLogoutURL = providerConfig.BackendLogoutURL
|
||||
return p, nil
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue