Skip to content

Commit

Permalink
feat: allow forwarding of params from client logout (#1374)
Browse files Browse the repository at this point in the history
* feat: add optional federated param to client logout

* chore: add comment

* chore: prefer generic parameter implementation

* chore: implement go side

* chore: remove unnecessary null check

---------

Co-authored-by: David Stutt <david@wundergraph.com>
  • Loading branch information
Aenimus and David Stutt committed Mar 7, 2024
1 parent 99801ce commit 85fdd01
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 6 deletions.
12 changes: 9 additions & 3 deletions packages/sdk/src/client/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@ import {
import { serialize } from '../utils';
import { applyPatch } from 'fast-json-patch';
import {
ResponseError,
InputValidationError,
AuthorizationError,
ValidationResponseJSON,
ClientOperationErrorCodes,
InputValidationError,
NoUserError,
ResponseError,
ValidationResponseJSON,
} from './errors';
import { deepClone } from '../utils/helper';

Expand Down Expand Up @@ -738,6 +738,12 @@ export class Client {
logout_openid_connect_provider: options?.logoutOpenidConnectProvider ? 'true' : 'false',
});

if (options?.parameters) {
for (const [key, value] of options.parameters) {
params.append(key, value);
}
}

const url = this.addUrlParams(`${this.options.baseURL}/auth/cookie/user/logout`, params);

const response = await this.fetch(url, {
Expand Down
6 changes: 6 additions & 0 deletions packages/sdk/src/client/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,12 @@ export interface LogoutOptions {
* Callback to be run after a succesful logout
* */
after?: () => void;
/**
* Parameters to be appended to the logout request
* Of particular note is the federated parameter:
* https://auth0.com/docs/authenticate/login/logout/log-users-out-of-idps#alternative-logout
* */
parameters?: URLSearchParams;
}

export type HasRequiredInput<Input extends object | undefined> = Input extends object
Expand Down
18 changes: 16 additions & 2 deletions pkg/authentication/authentication.go
Original file line number Diff line number Diff line change
Expand Up @@ -851,6 +851,8 @@ type UserLogoutHandler struct {
Log *zap.Logger
}

const logoutOpenidConnectProvider = "logout_openid_connect_provider"

func (u *UserLogoutHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
resetUserCookies(w, r, !u.InsecureCookies)
user := UserFromContext(r.Context())
Expand All @@ -864,7 +866,7 @@ func (u *UserLogoutHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
if strings.ToLower(r.URL.Query().Get("logout_openid_connect_provider")) == "true" {
if strings.ToLower(r.URL.Query().Get(logoutOpenidConnectProvider)) == "true" {
if err := u.logoutFromProvider(w, r, user); err != nil {
if u.Log != nil {
u.Log.Warn("could not disconnect user from OIDC provider", zap.Error(err))
Expand All @@ -873,6 +875,8 @@ func (u *UserLogoutHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
}
}

const ForwardedQueryParamsKey = "forwarded_query_params"

func (u *UserLogoutHandler) logoutFromProvider(w http.ResponseWriter, r *http.Request, user *User) error {
if user.ProviderName != "oidc" {
return fmt.Errorf("user provider %q is not OpenIDConnect", user.ProviderName)
Expand All @@ -884,7 +888,17 @@ func (u *UserLogoutHandler) logoutFromProvider(w http.ResponseWriter, r *http.Re
if err != nil {
return err
}
result, err := provider.Disconnect(r.Context(), user)

params := r.URL.Query()
// do not forward the "logout_openid_connect_provider" param
delete(params, logoutOpenidConnectProvider)

ctx := r.Context()
if len(params) > 0 {
ctx = context.WithValue(ctx, ForwardedQueryParamsKey, params)
}

result, err := provider.Disconnect(ctx, user)
if err != nil {
return err
}
Expand Down
9 changes: 8 additions & 1 deletion pkg/authentication/oidc.go
Original file line number Diff line number Diff line change
Expand Up @@ -381,7 +381,14 @@ func (p *OpenIDConnectProvider) disconnectDefault(ctx context.Context, user *Use
return nil, nil
}

func (p *OpenIDConnectProvider) disconnectAuth0(_ context.Context, _ *User) (*OpenIDDisconnectResult, error) {
func (p *OpenIDConnectProvider) disconnectAuth0(ctx context.Context, _ *User) (*OpenIDDisconnectResult, error) {
params, ok := ctx.Value(ForwardedQueryParamsKey).(url.Values)

if params != nil && ok {
return &OpenIDDisconnectResult{
Redirect: fmt.Sprintf("%sv2/logout?client_id=%s&%s", p.config.Issuer, p.clientID, params.Encode()),
}, nil
}
return &OpenIDDisconnectResult{
Redirect: fmt.Sprintf("%sv2/logout?client_id=%s", p.config.Issuer, p.clientID),
}, nil
Expand Down

0 comments on commit 85fdd01

Please sign in to comment.