Skip to content
Merged
17 changes: 17 additions & 0 deletions .changeset/modern-boxes-peel.md
Original file line number Diff line number Diff line change
@@ -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'
})
```
6 changes: 0 additions & 6 deletions packages/sdk-node/src/__tests__/authenticateRequest.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,6 @@ import { Request } from 'express';

import { authenticateRequest } from '../authenticateRequest';

const mockNext = jest.fn();

afterEach(() => {
mockNext.mockReset();
});

Comment on lines -6 to -11

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@dimkl fyi, Just cleaning this up

const mockClerkClient = () => ({
authenticateRequest: jest.fn(),
});
Expand Down
48 changes: 48 additions & 0 deletions packages/sdk-node/src/__tests__/verifyToken.test.ts
Original file line number Diff line number Diff line change
@@ -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',
}),
);
});
});
19 changes: 15 additions & 4 deletions packages/sdk-node/src/clerkClient.ts
Original file line number Diff line number Diff line change
@@ -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> = T extends (a: string, b: infer U) => infer R ? (a: string, b?: U) => R : never;
type VerifyTokenWithOptionalSecondArgument = MakeOptionalSecondArgument<typeof _verifyToken>;

type ClerkClient = ReturnType<typeof _createClerkClient> & {
expressWithAuth: ReturnType<typeof createClerkExpressWithAuth>;
expressRequireAuth: ReturnType<typeof createClerkExpressRequireAuth>;
verifyToken: typeof verifyToken;
verifyToken: VerifyTokenWithOptionalSecondArgument;
};

const buildVerifyToken = (params: VerifyTokenOptions) => {
return (...args: Parameters<VerifyTokenWithOptionalSecondArgument>) =>
_verifyToken(args[0], {
...params,
...args[1],

@dimkl dimkl May 10, 2024

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔧 Could you add 2 tests (with options, without options) to verify that everything works as expected?

});
};

/**
Expand All @@ -24,7 +35,7 @@ export function createClerkClient(options: ClerkOptions): ClerkClient {
return Object.assign(clerkClient, {
expressWithAuth,
expressRequireAuth,
verifyToken,
verifyToken: buildVerifyToken(options),
});
}

Expand Down