@@ -15,6 +15,7 @@ import (
1515 "time"
1616
1717 "github.com/coreos/go-oidc/v3/oidc"
18+ middlewareapi "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/middleware"
1819 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/options"
1920 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/sessions"
2021 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/authentication/hmacauth"
@@ -3583,3 +3584,49 @@ func TestGetOAuthRedirectURI(t *testing.T) {
35833584 })
35843585 }
35853586}
3587+
3588+func TestIdTokenPlaceholderInSignOut(t *testing.T) {
3589+ opts := baseTestOptions()
3590+ opts.WhitelistDomains = []string{"my-oidc-provider.example.com"}
3591+
3592+ err := validation.Validate(opts)
3593+ assert.NoError(t, err)
3594+
3595+ const emailAddress = "john.doe@example.com"
3596+ const userName = "9fcab5c9b889a557"
3597+ created := time.Now()
3598+
3599+ session := &sessions.SessionState{
3600+ User: userName,
3601+ Groups: []string{"a", "b"},
3602+ Email: emailAddress,
3603+ IDToken: "eYjjjjjj.vvvv.ddd",
3604+ AccessToken: "oauth_token",
3605+ CreatedAt: &created,
3606+ }
3607+
3608+ proxy, err := NewOAuthProxy(opts, func(email string) bool {
3609+ return true
3610+ })
3611+ assert.NoError(t, err)
3612+
3613+ // Save the required session
3614+ rw := httptest.NewRecorder()
3615+ req, _ := http.NewRequest("GET", "/", nil)
3616+ err = proxy.sessionStore.Save(rw, req, session)
3617+ assert.NoError(t, err)
3618+
3619+ rw = httptest.NewRecorder()
3620+
3621+ rdUrl := url.QueryEscape("https://my-oidc-provider.example.com/sign_out_page?id_token_hint={id_token}&post_logout_redirect_uri=https://my-app.example.com/")
3622+ req, _ = http.NewRequest("GET", "/oauth2/sign_out?rd="+rdUrl, nil)
3623+ req = middlewareapi.AddRequestScope(req, &middlewareapi.RequestScope{
3624+ RequestID: "11111111-2222-4333-8444-555555555555",
3625+ Session: session,
3626+ })
3627+
3628+ proxy.SignOut(rw, req)
3629+ newLocation := rw.Header().Values("Location")[0]
3630+
3631+ assert.Equal(t, "https://my-oidc-provider.example.com/sign_out_page?id_token_hint=eYjjjjjj.vvvv.ddd&post_logout_redirect_uri=https://my-app.example.com/", newLocation)
3632+}