Skip to content

Commit 4f93634

Browse files
authored
chore(backend,nextjs,astro): Introduce getAuthObjectFromJwt as internal utility (#6053)
1 parent a5619ed commit 4f93634

File tree

6 files changed

+32
-18
lines changed

6 files changed

+32
-18
lines changed

.changeset/twelve-feet-yell.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
'@clerk/backend': patch
3+
'@clerk/nextjs': patch
4+
'@clerk/astro': patch
5+
---
6+
7+
Introduce `getAuthObjectFromJwt` as internal utility function that centralizes the logic for generating auth objects from session JWTs.

packages/astro/src/server/get-auth.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { SignedInAuthObject, SignedOutAuthObject } from '@clerk/backend/internal';
2-
import { AuthStatus, signedInAuthObject, signedOutAuthObject } from '@clerk/backend/internal';
2+
import { AuthStatus, getAuthObjectFromJwt, signedOutAuthObject } from '@clerk/backend/internal';
33
import { decodeJwt } from '@clerk/backend/jwt';
44
import type { PendingSessionOptions } from '@clerk/types';
55
import type { APIContext } from 'astro';
@@ -40,15 +40,7 @@ export const createGetAuth = ({ noAuthStatusMessage }: { noAuthStatusMessage: st
4040
return signedOutAuthObject(options);
4141
}
4242

43-
const jwt = decodeJwt(authToken as string);
44-
// @ts-expect-error - TODO: Align types
45-
const authObject = signedInAuthObject(options, jwt.raw.text, jwt.payload);
46-
47-
if (treatPendingAsSignedOut && authObject.sessionStatus === 'pending') {
48-
return signedOutAuthObject(options);
49-
}
50-
51-
return authObject;
43+
return getAuthObjectFromJwt(decodeJwt(authToken as string), { ...options, treatPendingAsSignedOut });
5244
};
5345
};
5446

packages/backend/src/__tests__/exports.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ describe('subpath /internal exports', () => {
4747
"createRedirect",
4848
"debugRequestState",
4949
"decorateObjectWithResources",
50+
"getAuthObjectFromJwt",
5051
"getMachineTokenType",
5152
"isMachineToken",
5253
"isTokenTypeAccepted",

packages/backend/src/internal.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export {
2525
signedInAuthObject,
2626
authenticatedMachineObject,
2727
unauthenticatedMachineObject,
28+
getAuthObjectFromJwt,
2829
} from './tokens/authObjects';
2930

3031
export { AuthStatus } from './tokens/authStatus';

packages/backend/src/tokens/authObjects.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ import { createCheckAuthorization } from '@clerk/shared/authorization';
22
import { __experimental_JWTPayloadToAuthObjectProperties } from '@clerk/shared/jwtPayloadParser';
33
import type {
44
CheckAuthorizationFromSessionClaims,
5+
Jwt,
56
JwtPayload,
7+
PendingSessionOptions,
68
ServerGetToken,
79
ServerGetTokenOptions,
810
SessionStatusClaim,
@@ -131,7 +133,7 @@ const createDebug = (data: AuthObjectDebugData | undefined) => {
131133
* @internal
132134
*/
133135
export function signedInAuthObject(
134-
authenticateContext: AuthenticateContext,
136+
authenticateContext: Partial<AuthenticateContext>,
135137
sessionToken: string,
136138
sessionClaims: JwtPayload,
137139
): SignedInAuthObject {
@@ -326,3 +328,19 @@ const createGetToken: CreateGetToken = params => {
326328
return sessionToken;
327329
};
328330
};
331+
332+
/**
333+
* @internal
334+
*/
335+
export const getAuthObjectFromJwt = (
336+
jwt: Jwt,
337+
{ treatPendingAsSignedOut = true, ...options }: PendingSessionOptions & Partial<AuthenticateContext>,
338+
) => {
339+
const authObject = signedInAuthObject(options, jwt.raw.text, jwt.payload);
340+
341+
if (treatPendingAsSignedOut && authObject.sessionStatus === 'pending') {
342+
return signedOutAuthObject(options, authObject.sessionStatus);
343+
}
344+
345+
return authObject;
346+
};

packages/nextjs/src/server/data/getAuthDataFromRequest.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ import {
44
authenticatedMachineObject,
55
AuthStatus,
66
constants,
7+
getAuthObjectFromJwt,
78
getMachineTokenType,
89
isMachineToken,
910
isTokenTypeAccepted,
10-
signedInAuthObject,
1111
signedOutAuthObject,
1212
TokenType,
1313
unauthenticatedMachineObject,
@@ -66,12 +66,7 @@ export const getAuthDataFromRequestSync = (
6666

6767
opts.logger?.debug('jwt', jwt.raw);
6868

69-
// @ts-expect-error -- Restrict parameter type of options to only list what's needed
70-
authObject = signedInAuthObject(options, jwt.raw.text, jwt.payload);
71-
}
72-
73-
if (treatPendingAsSignedOut && authObject.sessionStatus === 'pending') {
74-
authObject = signedOutAuthObject(options, authObject.sessionStatus);
69+
return getAuthObjectFromJwt(jwt, options);
7570
}
7671

7772
return authObject;

0 commit comments

Comments
 (0)