Skip to content

Commit 55230a2

Browse files
committed
feat(oidc): ✨ Added handling for providers that don't refresh the refresh token
1 parent 2ba5604 commit 55230a2

File tree

25 files changed

+839
-1117
lines changed

25 files changed

+839
-1117
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
"defu": "^6.1.4",
4040
"h3": "^1.12.0",
4141
"jose": "^5.9.2",
42-
"ofetch": "^1.3.4",
42+
"ofetch": "^1.4.0",
4343
"scule": "^1.3.0",
4444
"sirv": "^2.0.4",
4545
"ufo": "^1.5.4",

playground/staticwebapp.config.json

Lines changed: 0 additions & 18 deletions
This file was deleted.

pnpm-lock.yaml

Lines changed: 475 additions & 752 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/module.ts

Lines changed: 62 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import type { OidcProviderConfig, ProviderConfigs, ProviderKeys } from './runtime/types/oidc'
2-
import type { AuthSessionConfig } from './runtime/types/session'
3-
import type { ProviderInfo } from './types'
1+
import type { OidcProviderConfig } from './runtime/server/utils/provider'
2+
import type { AuthSessionConfig, DevModeConfig, MiddlewareConfig, ProviderConfigs, ProviderKeys } from './runtime/types'
43
import { extendServerRpc, onDevToolsInitialized } from '@nuxt/devtools-kit'
54
import { addImportsDir, addPlugin, addRouteMiddleware, addServerHandler, addServerPlugin, createResolver, defineNuxtModule, extendRouteRules, useLogger } from '@nuxt/kit'
65
import { defu } from 'defu'
@@ -10,124 +9,39 @@ import { generateProviderUrl } from './runtime/server/utils/config'
109

1110
const RPC_NAMESPACE = 'nuxt-oidc-auth-rpc'
1211

13-
export interface ServerFunctions {
12+
interface ServerFunctions {
1413
getNuxtOidcAuthSecrets: () => Record<'tokenKey' | 'sessionSecret' | 'authSessionSecret', string>
1514
}
1615

17-
export interface ClientFunctions {
18-
showNotification: (message: string) => void
19-
}
20-
21-
export interface MiddlewareConfig {
22-
/**
23-
* Enables/disables the global middleware
24-
* @default true
25-
*/
26-
globalMiddlewareEnabled?: boolean
27-
/**
28-
* Enables/disables automatic registration of '/auth/login' and '/auth/logout' route rules
29-
* @default false
30-
*/
31-
customLoginPage?: boolean
32-
}
33-
34-
export interface DevModeConfig {
35-
/**
36-
* Enables/disables the dev mode. Dev mode can only be enabled when the app runs in a non production environment.
37-
* @default false
38-
*/
39-
enabled?: boolean
40-
/**
41-
* Sets the `userName` field on the user object
42-
* @default 'Nuxt OIDC Auth Dev'
43-
*/
44-
userName?: string
45-
/**
46-
* Sets the `providerInfo` field on the user object
47-
*/
48-
providerInfo?: ProviderInfo
49-
/**
50-
* Sets the key algorithm for signing the generated JWT token
51-
*/
52-
tokenAlgorithm?: 'symmetric' | 'asymmetric'
53-
/**
54-
* Sets the `idToken` field on the user object
55-
*/
56-
idToken?: string
57-
/**
58-
* Sets the `accessToken` field on the user object
59-
*/
60-
accessToken?: string
61-
/**
62-
* Sets the claims field on the user object and generated JWT token if `generateAccessToken` is set to `true`.
63-
*/
64-
claims?: Record<string, string>
65-
/**
66-
* If set generates a JWT token for the access_token field based on the given user information
67-
* @default false
68-
*/
69-
generateAccessToken?: boolean
70-
/**
71-
* Only used with `generateAccessToken`. Sets the issuer field on the generated JWT token.
72-
* @default 'nuxt:oidc:auth:issuer
73-
*/
74-
issuer?: string
75-
/**
76-
* Only used with `generateAccessToken`. Sets the audience field on the generated JWT token.
77-
* @default 'nuxt:oidc:auth:audience
78-
*/
79-
audience?: string
80-
/**
81-
* Only used with `generateAccessToken`. Sets the subject field on the generated JWT token.
82-
* @default 'nuxt:oidc:auth:subject
83-
*/
84-
subject?: string
85-
}
16+
interface ClientFunctions {}
8617

87-
export interface ModuleOptions {
88-
/**
89-
* Enable module
90-
*/
91-
enabled: boolean
92-
/**
93-
* Enable Nuxt devtools integration
94-
* @default true
95-
*/
96-
devtools?: boolean
97-
/**
98-
* Default provider. Will be used with composable if no provider is specified
99-
*/
100-
defaultProvider?: ProviderKeys
101-
/**
102-
* OIDC providers
103-
*/
104-
providers: Partial<ProviderConfigs>
105-
/**
106-
* Optional session configuration.
107-
*/
108-
session: AuthSessionConfig
109-
/**
110-
* Middleware configuration
111-
*/
112-
middleware: MiddlewareConfig
113-
/**
114-
* Dev mode configuration
115-
*/
116-
devMode?: DevModeConfig
117-
/**
118-
* Provide defaults for NUXT_OIDC_SESSION_SECRET, NUXT_OIDC_TOKEN_KEY and NUXT_OIDC_AUTH_SESSION_SECRET using a Nitro plugin. Turning this off can lead to the app not working if no secrets are provided.
119-
* @default true
120-
*/
121-
provideDefaultSecrets?: boolean
122-
}
18+
const { resolve } = createResolver(import.meta.url)
12319

12420
declare module '@nuxt/schema' {
12521
interface RuntimeConfig {
12622
oidc: ModuleOptions
12723
}
12824
}
12925

130-
const { resolve } = createResolver(import.meta.url)
26+
const DEFAULTS: ModuleOptions = {
27+
enabled: true,
28+
session: {
29+
automaticRefresh: true,
30+
expirationCheck: true,
31+
maxAge: 60 * 60 * 24, // 1 day
32+
cookie: {
33+
sameSite: 'lax',
34+
secure: process.env.NODE_ENV === 'production',
35+
},
36+
},
37+
providers: {} as ProviderConfigs,
38+
middleware: {
39+
globalMiddlewareEnabled: true,
40+
customLoginPage: false,
41+
},
42+
provideDefaultSecrets: true,
43+
devtools: true,
44+
}
13145

13246
export default defineNuxtModule<ModuleOptions>({
13347
meta: {
@@ -138,25 +52,7 @@ export default defineNuxtModule<ModuleOptions>({
13852
bridge: false,
13953
},
14054
},
141-
defaults: {
142-
enabled: true,
143-
session: {
144-
automaticRefresh: true,
145-
expirationCheck: true,
146-
maxAge: 60 * 60 * 24, // 1 day
147-
cookie: {
148-
sameSite: 'lax',
149-
secure: process.env.NODE_ENV === 'production',
150-
},
151-
},
152-
providers: {} as ProviderConfigs,
153-
middleware: {
154-
globalMiddlewareEnabled: true,
155-
customLoginPage: false,
156-
},
157-
provideDefaultSecrets: true,
158-
devtools: true,
159-
},
55+
defaults: DEFAULTS,
16056
setup(options, nuxt) {
16157
const logger = useLogger('nuxt-oidc-auth')
16258
if (!options.enabled)
@@ -336,3 +232,40 @@ export default defineNuxtModule<ModuleOptions>({
336232
)
337233
},
338234
})
235+
236+
export interface ModuleOptions {
237+
/**
238+
* Enable module
239+
*/
240+
enabled: boolean
241+
/**
242+
* Enable Nuxt devtools integration
243+
* @default true
244+
*/
245+
devtools?: boolean
246+
/**
247+
* Default provider. Will be used with composable if no provider is specified
248+
*/
249+
defaultProvider?: ProviderKeys
250+
/**
251+
* OIDC providers
252+
*/
253+
providers: Partial<ProviderConfigs>
254+
/**
255+
* Optional session configuration.
256+
*/
257+
session: AuthSessionConfig
258+
/**
259+
* Middleware configuration
260+
*/
261+
middleware: MiddlewareConfig
262+
/**
263+
* Dev mode configuration
264+
*/
265+
devMode?: DevModeConfig
266+
/**
267+
* Provide defaults for NUXT_OIDC_SESSION_SECRET, NUXT_OIDC_TOKEN_KEY and NUXT_OIDC_AUTH_SESSION_SECRET using a Nitro plugin. Turning this off can lead to the app not working if no secrets are provided.
268+
* @default true
269+
*/
270+
provideDefaultSecrets?: boolean
271+
}

src/runtime/composables/oidcAuth.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import type { ComputedRef, Ref } from '#imports'
2-
import type { ProviderKeys } from '../types/oidc'
3-
import type { UserSession } from '../types/session'
2+
import type { ProviderKeys, UserSession } from '../types'
43
import { computed, navigateTo, useRequestFetch, useState } from '#imports'
54

65
const useSessionState = () => useState<UserSession>('nuxt-oidc-auth-session', undefined)

src/runtime/middleware/oidcAuth.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@ export default defineNuxtRouteMiddleware(async (to: RouteLocationNormalized) =>
88
if (isErrorPage) {
99
return
1010
}
11-
1211
const { loggedIn, login } = useOidcAuth()
1312

14-
if (loggedIn.value === true || to.path.startsWith('/auth')) {
13+
if (loggedIn.value === true || to.path.startsWith('/auth/')) {
1514
return
1615
}
1716
await login()

src/runtime/providers/apple.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import type { OidcProviderConfig } from '../types/oidc'
2-
import { defineOidcProvider } from './provider'
1+
import type { OidcProviderConfig } from '../server/utils/provider'
2+
import { defineOidcProvider } from '../server/utils/provider'
33

44
type AppleRequiredFields = 'clientId' | 'clientSecret' | 'authorizationUrl' | 'tokenUrl' | 'redirectUri'
55

src/runtime/providers/auth0.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ofetch } from 'ofetch'
22
import { normalizeURL, withHttps, withoutTrailingSlash } from 'ufo'
3-
import { defineOidcProvider } from './provider'
3+
import { defineOidcProvider } from '../server/utils/provider'
44

55
interface Auth0ProviderConfig {
66
connection?: string

src/runtime/providers/entra.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ofetch } from 'ofetch'
22
import { parseURL } from 'ufo'
3-
import { defineOidcProvider } from './provider'
3+
import { defineOidcProvider } from '../server/utils/provider'
44

55
type EntraIdRequiredFields = 'clientId' | 'clientSecret' | 'authorizationUrl' | 'tokenUrl' | 'redirectUri'
66

src/runtime/providers/github.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import type { OidcProviderConfig } from '../types/oidc'
2-
import { defineOidcProvider } from './provider'
1+
import type { OidcProviderConfig } from '../server/utils/provider'
2+
import { defineOidcProvider } from '../server/utils/provider'
33

44
type GithubRequiredFields = 'clientId' | 'clientSecret' | 'redirectUri'
55

0 commit comments

Comments
 (0)