diff --git a/.changeset/chatty-loops-watch.md b/.changeset/chatty-loops-watch.md new file mode 100644 index 00000000000..f66f3c52a8f --- /dev/null +++ b/.changeset/chatty-loops-watch.md @@ -0,0 +1,20 @@ +--- +'@clerk/nuxt': minor +--- + +Deprecate `event.context.auth` in favor of `event.context.auth()` as function + +```diff +export default clerkMiddleware((event) => { ++ const { userId } = event.context.auth() +- const { userId } = event.context.auth + const isAdminRoute = event.path.startsWith('/api/admin') + + if (!userId && isAdminRoute) { + throw createError({ + statusCode: 401, + statusMessage: 'Unauthorized: User not signed in', + }) + } +}) +``` diff --git a/integration/templates/nuxt-node/server/api/me.js b/integration/templates/nuxt-node/server/api/me.js index 3534231821a..4d9540e5c01 100644 --- a/integration/templates/nuxt-node/server/api/me.js +++ b/integration/templates/nuxt-node/server/api/me.js @@ -1,7 +1,7 @@ import { clerkClient } from '@clerk/nuxt/server'; export default eventHandler(async event => { - const { userId } = event.context.auth; + const { userId } = event.context.auth(); if (!userId) { throw createError({ diff --git a/packages/nuxt/src/module.ts b/packages/nuxt/src/module.ts index aa5646f3cb9..6689db8ee9f 100644 --- a/packages/nuxt/src/module.ts +++ b/packages/nuxt/src/module.ts @@ -26,7 +26,7 @@ export type ModuleOptions = Omit { - * console.log('auth', event.context.auth) + * console.log('auth', event.context.auth()) * }) * ``` */ @@ -99,14 +99,18 @@ export default defineNuxtModule({ }); } - // Adds TS support for `event.context.auth` in event handlers + // Adds TS support for `event.context.auth()` in event handlers addTypeTemplate( { filename: 'types/clerk.d.ts', getContents: () => `import type { AuthObject } from '@clerk/backend'; declare module 'h3' { + type AuthObjectHandler = AuthObject & { + (): AuthObject; + } + interface H3EventContext { - auth: AuthObject; + auth: AuthObjectHandler; } } `, diff --git a/packages/nuxt/src/runtime/server/__tests__/clerkMiddleware.test.ts b/packages/nuxt/src/runtime/server/__tests__/clerkMiddleware.test.ts index 89766f0b1e5..03b8afdb2bf 100644 --- a/packages/nuxt/src/runtime/server/__tests__/clerkMiddleware.test.ts +++ b/packages/nuxt/src/runtime/server/__tests__/clerkMiddleware.test.ts @@ -42,7 +42,7 @@ describe('clerkMiddleware(params)', () => { app.use(clerkMiddleware()); app.use( '/', - eventHandler(event => event.context.auth), + eventHandler(event => event.context.auth()), ); const response = await handler(new Request(new URL('/', 'http://localhost'))); @@ -56,7 +56,7 @@ describe('clerkMiddleware(params)', () => { app.use(clerkMiddleware(MOCK_OPTIONS)); app.use( '/', - eventHandler(event => event.context.auth), + eventHandler(event => event.context.auth()), ); const response = await handler(new Request(new URL('/', 'http://localhost'))); @@ -75,7 +75,7 @@ describe('clerkMiddleware(params)', () => { ); app.use( '/', - eventHandler(event => event.context.auth), + eventHandler(event => event.context.auth()), ); const response = await handler(new Request(new URL('/', 'http://localhost'))); @@ -94,7 +94,7 @@ describe('clerkMiddleware(params)', () => { ); app.use( '/', - eventHandler(event => event.context.auth), + eventHandler(event => event.context.auth()), ); const response = await handler(new Request(new URL('/', 'http://localhost'))); diff --git a/packages/nuxt/src/runtime/server/clerkMiddleware.ts b/packages/nuxt/src/runtime/server/clerkMiddleware.ts index bee0214f968..60b690a22a3 100644 --- a/packages/nuxt/src/runtime/server/clerkMiddleware.ts +++ b/packages/nuxt/src/runtime/server/clerkMiddleware.ts @@ -1,5 +1,6 @@ import type { AuthenticateRequestOptions } from '@clerk/backend/internal'; import { AuthStatus, constants } from '@clerk/backend/internal'; +import { deprecated } from '@clerk/shared/deprecated'; import type { EventHandler } from 'h3'; import { createError, eventHandler, setResponseHeader } from 'h3'; @@ -98,7 +99,17 @@ export const clerkMiddleware: ClerkMiddleware = (...args: unknown[]) => { } const authObject = requestState.toAuth(); - event.context.auth = authObject; + const authHandler = () => authObject; + + const auth = new Proxy(Object.assign(authHandler, authObject), { + get(target, prop: string, receiver) { + deprecated('event.context.auth', 'Use `event.context.auth()` as a function instead.'); + + return Reflect.get(target, prop, receiver); + }, + }); + + event.context.auth = auth; // Internal serializable state that will be passed to the client event.context.__clerk_initial_state = createInitialState(authObject); diff --git a/packages/nuxt/src/runtime/server/getAuth.ts b/packages/nuxt/src/runtime/server/getAuth.ts index 75131eed715..339f76cac60 100644 --- a/packages/nuxt/src/runtime/server/getAuth.ts +++ b/packages/nuxt/src/runtime/server/getAuth.ts @@ -3,9 +3,11 @@ import type { H3Event } from 'h3'; import { moduleRegistrationRequired } from './errors'; export function getAuth(event: H3Event) { - if (!event.context.auth) { + const authObject = event.context.auth(); + + if (!authObject) { throw new Error(moduleRegistrationRequired); } - return event.context.auth; + return authObject; }