Skip to content

Commit 01197f1

Browse files
committed
Pass treatPendingAsSignedOut to auth on clerkMiddleware
1 parent 43f2356 commit 01197f1

File tree

2 files changed

+20
-9
lines changed

2 files changed

+20
-9
lines changed

packages/backend/src/tokens/authStatus.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { JwtPayload } from '@clerk/types';
1+
import type { JwtPayload, PendingSessionOptions } from '@clerk/types';
22

33
import { constants } from '../constants';
44
import type { TokenVerificationErrorReason } from '../errors';
@@ -27,7 +27,7 @@ export type SignedInState = {
2727
afterSignInUrl: string;
2828
afterSignUpUrl: string;
2929
isSignedIn: true;
30-
toAuth: () => SignedInAuthObject;
30+
toAuth: (opts?: PendingSessionOptions) => SignedInAuthObject;
3131
headers: Headers;
3232
token: string;
3333
};
@@ -99,7 +99,14 @@ export function signedIn(
9999
afterSignInUrl: authenticateContext.afterSignInUrl || '',
100100
afterSignUpUrl: authenticateContext.afterSignUpUrl || '',
101101
isSignedIn: true,
102-
toAuth: () => authObject,
102+
// @ts-expect-error Dynamically return `SignedOutAuthObject` based on options
103+
toAuth: ({ treatPendingAsSignedOut = true } = {}) => {
104+
if (treatPendingAsSignedOut && authObject.sessionStatus === 'pending') {
105+
return signedOutAuthObject();
106+
}
107+
108+
return authObject;
109+
},
103110
headers,
104111
token,
105112
};

packages/nextjs/src/server/clerkMiddleware.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { AuthObject, ClerkClient } from '@clerk/backend';
22
import type { AuthenticateRequestOptions, ClerkRequest, RedirectFun, RequestState } from '@clerk/backend/internal';
33
import { AuthStatus, constants, createClerkRequest, createRedirect } from '@clerk/backend/internal';
44
import { parsePublishableKey } from '@clerk/shared/keys';
5+
import type { PendingSessionOptions } from '@clerk/types';
56
import { notFound as nextjsNotFound } from 'next/navigation';
67
import type { NextMiddleware, NextRequest } from 'next/server';
78
import { NextResponse } from 'next/server';
@@ -41,7 +42,7 @@ export type ClerkMiddlewareAuthObject = AuthObject & {
4142
};
4243

4344
export interface ClerkMiddlewareAuth {
44-
(): Promise<ClerkMiddlewareAuthObject>;
45+
(opts?: PendingSessionOptions): Promise<ClerkMiddlewareAuthObject>;
4546

4647
protect: AuthProtect;
4748
}
@@ -182,11 +183,14 @@ export const clerkMiddleware = ((...args: unknown[]): NextMiddleware | NextMiddl
182183
const redirectToSignUp = createMiddlewareRedirectToSignUp(clerkRequest);
183184
const protect = await createMiddlewareProtect(clerkRequest, authObject, redirectToSignIn);
184185

185-
const authObjWithMethods: ClerkMiddlewareAuthObject = Object.assign(authObject, {
186-
redirectToSignIn,
187-
redirectToSignUp,
188-
});
189-
const authHandler = () => Promise.resolve(authObjWithMethods);
186+
const authHandler = (opts?: PendingSessionOptions) => {
187+
const authObjWithMethods: ClerkMiddlewareAuthObject = Object.assign(requestState.toAuth(opts), {
188+
redirectToSignIn,
189+
redirectToSignUp,
190+
});
191+
192+
return Promise.resolve(authObjWithMethods);
193+
};
190194
authHandler.protect = protect;
191195

192196
let handlerResult: Response = NextResponse.next();

0 commit comments

Comments
 (0)