Skip to content

Commit 88e3b77

Browse files
authored
feat: add skip logout consent option (#319)
1 parent 2c2c90a commit 88e3b77

File tree

3 files changed

+48
-23
lines changed

3 files changed

+48
-23
lines changed

src/pkg/index.ts

+8
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import sdk, { apiBaseUrl } from "./sdk"
55
import {
66
UiNode,
77
ErrorAuthenticatorAssuranceLevelNotSatisfied,
8+
OAuth2LogoutRequest,
89
} from "@ory/client"
910
import { ButtonLink, Divider, MenuLink, Typography } from "@ory/elements-markup"
1011
import { filterNodesByGroups } from "@ory/integrations/ui"
@@ -50,6 +51,13 @@ export const defaultConfig: RouteOptionsCreator = () => {
5051
? true
5152
: false
5253
},
54+
shouldSkipLogoutConsent: (challenge) => {
55+
return (
56+
challenge.client as OAuth2LogoutRequest & {
57+
skip_logout_consent: boolean
58+
}
59+
)?.skip_logout_consent
60+
},
5361
...sdk,
5462
}
5563
}

src/pkg/route.ts

+5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
IdentityApi,
66
OAuth2Api,
77
OAuth2ConsentRequest,
8+
OAuth2LogoutRequest,
89
} from "@ory/client"
910
import { Theme } from "@ory/elements-markup"
1011
import { NextFunction, Request, Response, Router } from "express"
@@ -20,11 +21,15 @@ export interface RouteOptions {
2021
// This is used to determine if the consent route should be registered
2122
// We need to check if the required environment variables are set
2223
isOAuthConsentRouteEnabled: () => boolean
24+
2325
// Checks if the OAuth2 consent request should be skipped
2426
// In some cases Hydra will let us skip the consent request
2527
// Setting `TRUSTED_CLIENT_IDS` will skip the consent request for the given client ids
2628
shouldSkipConsent: (challenge: OAuth2ConsentRequest) => boolean
2729

30+
// When this returns true, the logout screen will not be shown.
31+
shouldSkipLogoutConsent: (challenge: OAuth2LogoutRequest) => boolean
32+
2833
logoUrl?: string
2934
faviconUrl?: string
3035
faviconType?: string

src/routes/logout.ts

+35-23
Original file line numberDiff line numberDiff line change
@@ -19,30 +19,42 @@ export const createShowLogoutRoute: RouteCreator =
1919

2020
if (typeof logoutChallenge !== "string") {
2121
logger.debug("Expected a logout challenge to be set but received none.")
22-
next(
23-
new Error("Expected a logout challenge to be set but received none."),
24-
)
22+
res.redirect("login")
2523
return
2624
}
2725

28-
// this should never happen
29-
if (!req.csrfToken) {
30-
logger.warn("Expected CSRF token middleware to be set but received none.")
31-
next(
32-
new Error(
33-
"Expected CSRF token middleware to be set but received none.",
34-
),
35-
)
36-
return
37-
}
26+
const { oauth2, shouldSkipLogoutConsent } = createHelpers(req, res)
27+
oauth2
28+
.getOAuth2LogoutRequest({ logoutChallenge })
29+
.then(({ data: body }) => {
30+
if (shouldSkipLogoutConsent(body)) {
31+
return oauth2
32+
.acceptOAuth2LogoutRequest({ logoutChallenge })
33+
.then(({ data: body }) => res.redirect(body.redirect_to))
34+
}
35+
36+
// this should never happen
37+
if (!req.csrfToken) {
38+
logger.warn(
39+
"Expected CSRF token middleware to be set but received none.",
40+
)
41+
next(
42+
new Error(
43+
"Expected CSRF token middleware to be set but received none.",
44+
),
45+
)
46+
return
47+
}
3848

39-
res.render("logout", {
40-
card: UserLogoutCard({
41-
csrfToken: req.csrfToken(true),
42-
challenge: logoutChallenge,
43-
action: "logout",
44-
}),
45-
})
49+
res.render("logout", {
50+
card: UserLogoutCard({
51+
csrfToken: req.csrfToken(true),
52+
challenge: logoutChallenge,
53+
action: "logout",
54+
}),
55+
})
56+
})
57+
.catch(() => res.redirect("login"))
4658
}
4759

4860
export const createSubmitLogoutRoute: RouteCreator =
@@ -60,15 +72,15 @@ export const createSubmitLogoutRoute: RouteCreator =
6072
// The user rejected to log out, so we'll redirect to /ui/welcome
6173
return oauth2
6274
.rejectOAuth2LogoutRequest({ logoutChallenge })
63-
.then(() => res.redirect("welcome"))
64-
.catch(() => res.redirect("welcome"))
75+
.then(() => res.redirect("login"))
76+
.catch(() => res.redirect("login"))
6577
} else {
6678
logger.debug("User agreed to log out.")
6779
// The user agreed to log out, let's accept the logout request.
6880
return oauth2
6981
.acceptOAuth2LogoutRequest({ logoutChallenge })
7082
.then(({ data: body }) => res.redirect(body.redirect_to))
71-
.catch(() => res.redirect("welcome"))
83+
.catch(() => res.redirect("login"))
7284
}
7385
}
7486

0 commit comments

Comments
 (0)