Skip to content

Commit 6f70645

Browse files
committed
refactor(token): ♻️ Improved token validation
1 parent b295030 commit 6f70645

File tree

8 files changed

+36
-11
lines changed

8 files changed

+36
-11
lines changed

.vscode/settings.json

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,28 @@
1616
"typescript.format.enable": true,
1717
"typescript.preferences.quoteStyle": "single",
1818
"html.format.wrapAttributes": "force-expand-multiline",
19-
"unocss.root": ["playground"]
19+
"unocss.root": ["playground"],
20+
"eslint.validate": [
21+
"javascript",
22+
"javascriptreact",
23+
"typescript",
24+
"typescriptreact",
25+
"vue",
26+
"html",
27+
"markdown",
28+
"json",
29+
"jsonc",
30+
"yaml",
31+
"toml",
32+
"xml",
33+
"gql",
34+
"graphql",
35+
"astro",
36+
"svelte",
37+
"css",
38+
"less",
39+
"scss",
40+
"pcss",
41+
"postcss"
42+
]
2043
}

eslint.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export default createConfigForNuxt({
1414
}).prepend(
1515
antfu(
1616
{
17-
ignores: ['playground/', 'client/'],
17+
ignores: ['client/'],
1818
unocss: false,
1919
markdown: false,
2020
rules: {

playground/nuxt.config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export default defineNuxtConfig({
7373
logoutRedirectUri: 'https://google.com',
7474
baseUrl: '',
7575
exposeIdToken: true,
76-
}
76+
},
7777
},
7878
session: {
7979
expirationCheck: true,
@@ -103,7 +103,7 @@ export default defineNuxtConfig({
103103

104104
unocss: {
105105
preflight: true,
106-
configFile: 'uno.config.ts'
106+
configFile: 'uno.config.ts',
107107
},
108108

109109
devtools: { enabled: true },

playground/pages/auth/login.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
definePageMeta({
33
layout: 'authentication',
44
})
5-
const { currentProvider, login, user } = useOidcAuth()
5+
const { currentProvider, login } = useOidcAuth()
66
const { providers } = useProviders(currentProvider.value as string)
77
// use `@click="login(provider.name as any, { test: 'thiswillappearinentra', test2: 'thiswillbeignored' })"` for testing the logout params
88
</script>

playground/server/plugins/session.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export default defineNitroPlugin(() => {
1414
})
1515

1616
sessionHooks.hook('refresh', async (session) => {
17+
// eslint-disable-next-line no-console
1718
console.log('Injecting "status" claim as test on refresh')
1819
if (!(Object.keys(session).length === 0)) {
1920
const claimToAdd = { status: 'Refresh' }

src/runtime/server/lib/oidc.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,15 +188,16 @@ export function callbackEventHandler({ onSuccess }: OAuthConfig<UserSession>) {
188188

189189
// Validate tokens only if audience is matched
190190
const accessToken = parseJwtToken(tokenResponse.access_token, !!config.skipAccessTokenParsing)
191-
if ([config.audience, config.clientId].some(audience => accessToken.aud?.includes(audience as string)) && (config.validateAccessToken || config.validateIdToken)) {
191+
const idToken = tokenResponse.id_token ? parseJwtToken(tokenResponse.id_token) : undefined
192+
if ([config.audience as string, config.clientId].some(audience => accessToken.aud?.includes(audience) || idToken?.aud?.includes(audience)) && (config.validateAccessToken || config.validateIdToken)) {
192193
// Get OIDC configuration
193194
const openIdConfiguration = (config.openIdConfiguration && typeof config.openIdConfiguration === 'object') ? config.openIdConfiguration : typeof config.openIdConfiguration === 'string' ? await ofetch(config.openIdConfiguration) : await (config.openIdConfiguration!)(config)
194-
const validationOptions = { jwksUri: openIdConfiguration.jwks_uri as string, issuer: openIdConfiguration.issuer as string }
195+
const validationOptions = { jwksUri: openIdConfiguration.jwks_uri as string, issuer: openIdConfiguration.issuer as string, ...config.audience && { audience: config.audience } }
195196

196197
tokens = {
197198
accessToken: config.validateAccessToken ? await validateToken(tokenResponse.access_token, validationOptions) : accessToken,
198199
...tokenResponse.refresh_token && { refreshToken: tokenResponse.refresh_token },
199-
...tokenResponse.id_token && { idToken: config.validateIdToken ? await validateToken(tokenResponse.id_token, { jwksUri: openIdConfiguration.jwks_uri as string, issuer: openIdConfiguration.issuer as string }) : parseJwtToken(tokenResponse.id_token) },
200+
...tokenResponse.id_token && { idToken: config.validateIdToken ? await validateToken(tokenResponse.id_token, validationOptions) : parseJwtToken(tokenResponse.id_token) },
200201
}
201202
}
202203
else {
@@ -213,7 +214,7 @@ export function callbackEventHandler({ onSuccess }: OAuthConfig<UserSession>) {
213214
canRefresh: !!tokens.refreshToken,
214215
loggedInAt: timestamp,
215216
updatedAt: timestamp,
216-
expireAt: accessToken.exp || timestamp + useRuntimeConfig().oidc.session.maxAge!,
217+
expireAt: tokens.accessToken.exp || timestamp + useRuntimeConfig().oidc.session.maxAge!,
217218
provider,
218219
}
219220

src/runtime/server/utils/oidc.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ export async function refreshAccessToken(refreshToken: string, config: OidcProvi
6767
const user: Omit<UserSession, 'provider'> = {
6868
canRefresh: !!tokens.refreshToken,
6969
updatedAt: Math.trunc(Date.now() / 1000), // Use seconds instead of milliseconds to align wih JWT
70-
expireAt: parseJwtToken(tokenResponse.access_token).exp || Math.trunc(Date.now() / 1000) + 3600, // Fallback 60 min
70+
expireAt: parseJwtToken(tokenResponse.access_token, !!config.skipAccessTokenParsing)?.exp || Math.trunc(Date.now() / 1000) + 3600, // Fallback 60 min
7171
}
7272

7373
// Update optional claims

src/runtime/server/utils/session.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export async function refreshUserSession(event: H3Event) {
8585
const { user, tokens, expiresIn } = tokenRefreshResponse!
8686

8787
// Replace the session storage
88-
const accessToken = parseJwtToken(tokens.accessToken, providerPresets[provider].skipAccessTokenParsing)
88+
const accessToken = parseJwtToken(tokens.accessToken, !!config.skipAccessTokenParsing)
8989

9090
const updatedPersistentSession: PersistentSession = {
9191
exp: accessToken.exp || Math.trunc(Date.now() / 1000) + Number.parseInt(expiresIn),

0 commit comments

Comments
 (0)