diff --git a/.changeset/modern-boxes-peel.md b/.changeset/modern-boxes-peel.md new file mode 100644 index 00000000000..ee264083e0e --- /dev/null +++ b/.changeset/modern-boxes-peel.md @@ -0,0 +1,17 @@ +--- +'@clerk/clerk-sdk-node': patch +'@clerk/backend': patch +--- + +Inherit verifyToken options from clerkClient. +The below code now works as expected: (requires CLERK_SECRET_KEY env var to have been set) +```ts +import { clerkClient } from "@clerk/clerk-sdk-node"; + +// Use the default settings from the already instanciated clerkClient +clerkClient.verifyToken(token) +// or provide overrides the options +clerkClient.verifyToken(token, { + secretKey: 'xxxx' +}) +``` diff --git a/packages/sdk-node/src/__tests__/authenticateRequest.test.ts b/packages/sdk-node/src/__tests__/authenticateRequest.test.ts index 1d1751d43e3..27753a593cb 100644 --- a/packages/sdk-node/src/__tests__/authenticateRequest.test.ts +++ b/packages/sdk-node/src/__tests__/authenticateRequest.test.ts @@ -3,12 +3,6 @@ import { Request } from 'express'; import { authenticateRequest } from '../authenticateRequest'; -const mockNext = jest.fn(); - -afterEach(() => { - mockNext.mockReset(); -}); - const mockClerkClient = () => ({ authenticateRequest: jest.fn(), }); diff --git a/packages/sdk-node/src/__tests__/verifyToken.test.ts b/packages/sdk-node/src/__tests__/verifyToken.test.ts new file mode 100644 index 00000000000..39d5db1044e --- /dev/null +++ b/packages/sdk-node/src/__tests__/verifyToken.test.ts @@ -0,0 +1,48 @@ +const verifyTokenMock = jest.fn(); + +jest.mock('@clerk/backend', () => ({ + ...jest.requireActual('@clerk/backend'), + verifyToken: verifyTokenMock, +})); + +import { createClerkClient } from '../clerkClient'; + +afterEach(() => { + verifyTokenMock.mockReset(); +}); + +describe('verifyToken', () => { + it('correctly use the predefined options of clerkClient', async () => { + const clerkClient = createClerkClient({ + secretKey: '123', + jwtKey: '456', + }); + + await clerkClient.verifyToken('token'); + expect(verifyTokenMock).toHaveBeenCalledWith( + 'token', + expect.objectContaining({ + secretKey: '123', + jwtKey: '456', + }), + ); + }); + + it('correctly use the passed options in verifyToken', async () => { + const clerkClient = createClerkClient({ + secretKey: '123', + jwtKey: '456', + }); + + await clerkClient.verifyToken('token', { + secretKey: '987', + }); + expect(verifyTokenMock).toHaveBeenCalledWith( + 'token', + expect.objectContaining({ + secretKey: '987', + jwtKey: '456', + }), + ); + }); +}); diff --git a/packages/sdk-node/src/clerkClient.ts b/packages/sdk-node/src/clerkClient.ts index fe58cb9dd3c..b9f26da14cf 100644 --- a/packages/sdk-node/src/clerkClient.ts +++ b/packages/sdk-node/src/clerkClient.ts @@ -1,14 +1,25 @@ -import type { ClerkOptions } from '@clerk/backend'; -import { createClerkClient as _createClerkClient, verifyToken } from '@clerk/backend'; +import type { ClerkOptions, VerifyTokenOptions } from '@clerk/backend'; +import { createClerkClient as _createClerkClient, verifyToken as _verifyToken } from '@clerk/backend'; import { createClerkExpressRequireAuth } from './clerkExpressRequireAuth'; import { createClerkExpressWithAuth } from './clerkExpressWithAuth'; import { loadApiEnv, loadClientEnv } from './utils'; +type MakeOptionalSecondArgument = T extends (a: string, b: infer U) => infer R ? (a: string, b?: U) => R : never; +type VerifyTokenWithOptionalSecondArgument = MakeOptionalSecondArgument; + type ClerkClient = ReturnType & { expressWithAuth: ReturnType; expressRequireAuth: ReturnType; - verifyToken: typeof verifyToken; + verifyToken: VerifyTokenWithOptionalSecondArgument; +}; + +const buildVerifyToken = (params: VerifyTokenOptions) => { + return (...args: Parameters) => + _verifyToken(args[0], { + ...params, + ...args[1], + }); }; /** @@ -24,7 +35,7 @@ export function createClerkClient(options: ClerkOptions): ClerkClient { return Object.assign(clerkClient, { expressWithAuth, expressRequireAuth, - verifyToken, + verifyToken: buildVerifyToken(options), }); }