Skip to content

Commit 4714d75

Browse files
committed
feat(oidc): ✨ Added additionalLogoutParameters property to customize the logout redirect
1 parent b01121d commit 4714d75

File tree

7 files changed

+31
-11
lines changed

7 files changed

+31
-11
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
"dev": "nuxi dev playground",
2929
"dev:prepare": "nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground && nuxi prepare client",
3030
"release": "pnpm lint && pnpm prepack && changelogen --release && git push --follow-tags && pnpm publish --access=public",
31-
"lint": "eslint .",
31+
"lint": "eslint . && tsc --noemit",
3232
"test": "vitest run",
3333
"test:watch": "vitest watch"
3434
},

playground/nuxt.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ export default defineNuxtConfig({
9696

9797
unocss: {
9898
preflight: true,
99+
configFile: 'uno.config.ts'
99100
},
100101

101102
devtools: { enabled: true },

src/runtime/server/lib/oidc.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,10 +282,14 @@ export function logoutEventHandler({ onSuccess }: OAuthConfig<UserSession>) {
282282

283283
if (config.logoutUrl) {
284284
const logoutParams = getQuery(event)
285-
const logoutRedirectUri = logoutParams.logoutRedirectUri ?? `${getRequestURL(event).protocol}//${getRequestURL(event).host}`
285+
const logoutRedirectUri = logoutParams.logoutRedirectUri || config.logoutRedirectUri || `${getRequestURL(event).protocol}//${getRequestURL(event).host}`
286+
const location = withQuery(config.logoutUrl, {
287+
...config.logoutRedirectParameterName && { [config.logoutRedirectParameterName]: logoutRedirectUri },
288+
...config.additionalLogoutParameters && convertObjectToSnakeCase(config.additionalLogoutParameters),
289+
})
286290
return sendRedirect(
287291
event,
288-
withQuery(config.logoutUrl, { ...config.logoutRedirectParameterName && { [config.logoutRedirectParameterName]: logoutRedirectUri } }),
292+
location,
289293
200,
290294
)
291295
}

src/runtime/server/utils/oidc.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ export async function refreshAccessToken(refreshToken: string, config: OidcProvi
6262
}
6363

6464
// Construct user object
65-
const user: UserSession = {
65+
const user: Omit<UserSession, 'provider'> = {
6666
canRefresh: !!tokens.refreshToken,
6767
updatedAt: Math.trunc(Date.now() / 1000), // Use seconds instead of milliseconds to align wih JWT
6868
expireAt: parseJwtToken(tokenResponse.access_token).exp || Math.trunc(Date.now() / 1000) + 3600, // Fallback 60 min

src/runtime/server/utils/provider.ts

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -114,17 +114,28 @@ export interface OidcProviderConfig {
114114
*/
115115
skipAccessTokenParsing?: boolean
116116
/**
117-
* Query parameter name for logout redirect. Will be appended to the logoutUrl as a query parameter.
117+
* Query parameter name for logout redirect. Will be appended to the logoutUrl as a query parameter with this value and the name of logoutRedirectParameterName.
118+
*/
119+
logoutRedirectUri?: string
120+
/**
121+
* Query parameter name for logout redirect. Will be appended to the logoutUrl as a query parameter with this name and a value of logoutRedirectUri. The logoutRedirectUri can also be provided as a parameter with the `logout` composable function.
118122
*/
119123
logoutRedirectParameterName?: string
120124
/**
121125
* Additional parameters to be added to the authorization request
126+
* @default undefined
122127
*/
123128
additionalAuthParameters?: Record<string, string>
124129
/**
125130
* Additional parameters to be added to the token request
131+
* @default undefined
126132
*/
127133
additionalTokenParameters?: Record<string, string>
134+
/**
135+
* Additional parameters to be added to the logout request
136+
* @default undefined
137+
*/
138+
additionalLogoutParameters?: Record<string, string>
128139
/**
129140
* OpenID Configuration object or function promise that resolves to an OpenID Configuration object
130141
*/
@@ -174,9 +185,9 @@ export interface OidcProviderConfig {
174185
allowedClientAuthParameters?: string[]
175186
/**
176187
* Session configuration overrides
177-
* @default {}
188+
* @default undefined
178189
*/
179-
sessionConfiguration: ProviderSessionConfig
190+
sessionConfiguration?: ProviderSessionConfig
180191
}
181192

182193
// Cannot import from utils here, otherwise Nuxt will throw '[worker reload] [worker init] Cannot access 'configMerger' before initialization'
@@ -187,7 +198,7 @@ const configMerger = createDefu((obj, key, value) => {
187198
}
188199
})
189200

190-
export function defineOidcProvider<TConfig, TRequired extends keyof OidcProviderConfig>(config: Partial<OidcProviderConfig> & { additionalAuthParameters?: TConfig; additionalTokenParameters?: TConfig } = {} as any) {
201+
export function defineOidcProvider<TConfig, TRequired extends keyof OidcProviderConfig>(config: Partial<OidcProviderConfig> & { additionalAuthParameters?: TConfig; additionalTokenParameters?: TConfig; additionalLogoutParameters?: TConfig } = {} as any) {
191202
const defaults: Partial<OidcProviderConfig> = {
192203
clientId: '',
193204
redirectUri: '',
@@ -215,9 +226,12 @@ export function defineOidcProvider<TConfig, TRequired extends keyof OidcProvider
215226
exposeAccessToken: false,
216227
exposeIdToken: false,
217228
callbackRedirectUrl: '/',
218-
allowedClientAuthParameters: [],
229+
allowedClientAuthParameters: undefined,
219230
logoutUrl: '',
220-
sessionConfiguration: {},
231+
sessionConfiguration: undefined,
232+
additionalAuthParameters: undefined,
233+
additionalTokenParameters: undefined,
234+
additionalLogoutParameters: undefined,
221235
}
222236
const mergedConfig = configMerger(config, defaults)
223237
return mergedConfig as MakePropertiesRequired<Partial<typeof mergedConfig>, TRequired>

src/runtime/server/utils/session.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ export async function refreshUserSession(event: H3Event) {
9595
}
9696

9797
await useStorage('oidc').setItem<PersistentSession>(session.id as string, updatedPersistentSession)
98-
await session.update(defu(user, session.data))
98+
await session.update(defu(user as UserSession, session.data))
9999

100100
return session.data
101101
}

tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"extends": "./.nuxt/tsconfig.json",
33
"exclude": [
4+
"client",
45
"playground",
56
"dist"
67
]

0 commit comments

Comments
 (0)