Skip to content

Commit 355e865

Browse files
feat(#673, #523, #848): back-port authjs migration (#849)
Co-authored-by: Zoey <[email protected]>
1 parent 2374f40 commit 355e865

File tree

8 files changed

+444
-244
lines changed

8 files changed

+444
-244
lines changed

playground-authjs/app.vue

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
11
<script setup lang="ts">
2-
import { useAuth, useRoute, useFetch, useRequestHeaders } from '#imports'
2+
import { useAuth, useRoute, useRequestHeaders, useAsyncData } from '#imports'
33
44
const { data, status, lastRefreshedAt, getCsrfToken, getProviders, signIn, signOut, getSession } = useAuth()
55
66
const providers = await getProviders()
77
const csrfToken = await getCsrfToken()
88
9-
const headers = useRequestHeaders(['cookie']) as HeadersInit
10-
const { data: token } = await useFetch('/api/token', { headers })
9+
// TEMP: Due to a bug in Nuxt `$fetch` (and thus in `useFetch`),
10+
// we need to transform `undefined` returned from `$fetch` to `null`.
11+
// The issue seems to be in type coalescing happening under the hood of `$fetch`:
12+
// `null` and `''` are both transformed into `undefined` which is not correct.
13+
const { data: token } = await useAsyncData(
14+
'/api/token',
15+
async () => {
16+
const headers = useRequestHeaders(['cookie'])
17+
const result = await $fetch('/api/token', { headers })
18+
return result ?? null
19+
}
20+
)
1121
1222
const route = useRoute()
1323
</script>

playground-local/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
"zod": "^3.23.8"
1717
},
1818
"devDependencies": {
19-
"@nuxt/test-utils": "^3.14.0",
20-
"@playwright/test": "^1.45.3",
19+
"@nuxt/test-utils": "^3.14.1",
20+
"@playwright/test": "^1.46.0",
2121
"@types/jsonwebtoken": "^9.0.6",
22-
"@types/node": "^18.19.42",
22+
"@types/node": "^18.19.44",
2323
"@vue/test-utils": "^2.4.6",
2424
"eslint": "^8.57.0",
2525
"nuxt": "^3.12.4",

playground-refresh/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
"zod": "^3.23.8"
1717
},
1818
"devDependencies": {
19-
"@nuxt/test-utils": "^3.14.0",
20-
"@playwright/test": "^1.45.3",
19+
"@nuxt/test-utils": "^3.14.1",
20+
"@playwright/test": "^1.46.0",
2121
"@types/jsonwebtoken": "^9.0.6",
2222
"@vue/test-utils": "^2.4.6",
2323
"eslint": "^8.57.0",

pnpm-lock.yaml

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

src/runtime/server/services/authjs/nuxtAuthHandler.ts

Lines changed: 183 additions & 135 deletions
Large diffs are not rendered by default.
Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { H3Event } from 'h3'
22
import getURL from 'requrl'
3-
import { joinURL } from 'ufo'
43
import { camelCase } from 'scule'
54
import { isProduction } from '../../helpers'
65
import { ERROR_MESSAGES } from './errors'
@@ -9,13 +8,13 @@ import { useRuntimeConfig } from '#imports'
98
/**
109
* Get `origin` and fallback to `x-forwarded-host` or `host` headers if not in production.
1110
*/
12-
export const getServerOrigin = (event?: H3Event): string => {
11+
export function getServerOrigin (event?: H3Event): string {
1312
const config = useRuntimeConfig()
1413

1514
// Prio 1: Environment variable
16-
const envOriginKey = config.public.auth.originEnvKey!
17-
const envOriginKeyCamelcase = camelCase(envOriginKey, { normalize: true })
18-
const envOrigin = (config[envOriginKeyCamelcase] ?? process.env[envOriginKey]) as string | undefined
15+
const envOriginKey = config.public.auth.originEnvKey
16+
const envFromRuntimeConfig = extractFromRuntimeConfig(config, envOriginKey)
17+
const envOrigin = envFromRuntimeConfig ?? process.env[envOriginKey]
1918
if (envOrigin) {
2019
return envOrigin
2120
}
@@ -34,20 +33,16 @@ export const getServerOrigin = (event?: H3Event): string => {
3433
throw new Error(ERROR_MESSAGES.NO_ORIGIN)
3534
}
3635

37-
/** Get the request url or construct it */
38-
export const getRequestURLFromRequest = (event: H3Event, { trustHost }: { trustHost: boolean }): string | undefined => {
39-
if (trustHost) {
40-
const forwardedValue = getURL(event.node.req)
41-
if (forwardedValue) {
42-
return Array.isArray(forwardedValue) ? forwardedValue[0] : forwardedValue
43-
}
44-
}
36+
type RuntimeConfig = ReturnType<typeof useRuntimeConfig>
4537

46-
let origin
47-
try {
48-
origin = getServerOrigin(event)
49-
} catch (error) {
50-
return undefined
51-
}
52-
return joinURL(origin, useRuntimeConfig().public.auth.computed.pathname)
38+
function extractFromRuntimeConfig (config: RuntimeConfig, envVariableName: string): string | undefined {
39+
let normalized = envVariableName.startsWith('NUXT_')
40+
? envVariableName.slice(5)
41+
: envVariableName
42+
normalized = camelCase(normalized, { normalize: true })
43+
44+
const extracted = config[normalized]
45+
return typeof extracted === 'string'
46+
? extracted
47+
: undefined
5348
}

src/runtime/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,7 @@ export interface ModuleOptionsNormalized extends ModuleOptions {
587587
provider: Required<NonNullable<ModuleOptions['provider']>>
588588
sessionRefresh: NonNullable<ModuleOptions['sessionRefresh']>
589589
globalAppMiddleware: NonNullable<ModuleOptions['globalAppMiddleware']>
590+
originEnvKey: string
590591

591592
computed: {
592593
origin: string | undefined
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
export const isNonEmptyObject = (obj: any) => typeof obj === 'object' && Object.keys(obj).length > 0
1+
export const isNonEmptyObject = (obj: any) => typeof obj === 'object' && obj !== null && Object.keys(obj).length > 0

0 commit comments

Comments
 (0)