From b5d3af339c2981b5c673dc1e7f0c3ba1f367b9ae Mon Sep 17 00:00:00 2001 From: Kevin Wang Date: Fri, 24 Apr 2026 22:19:57 -0400 Subject: [PATCH 1/2] fix(buildPublishableKey): build unpadded key --- packages/shared/src/__tests__/keys.spec.ts | 6 +++--- packages/shared/src/keys.ts | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/shared/src/__tests__/keys.spec.ts b/packages/shared/src/__tests__/keys.spec.ts index a4e493171ac..ccca512bf79 100644 --- a/packages/shared/src/__tests__/keys.spec.ts +++ b/packages/shared/src/__tests__/keys.spec.ts @@ -14,9 +14,9 @@ import { describe('buildPublishableKey(frontendApi)', () => { const cases = [ - ['fake-clerk-test.clerk.accounts.dev', 'pk_live_ZmFrZS1jbGVyay10ZXN0LmNsZXJrLmFjY291bnRzLmRldiQ='], + ['fake-clerk-test.clerk.accounts.dev', 'pk_live_ZmFrZS1jbGVyay10ZXN0LmNsZXJrLmFjY291bnRzLmRldiQ'], ['foo-bar-13.clerk.accounts.dev', 'pk_test_Zm9vLWJhci0xMy5jbGVyay5hY2NvdW50cy5kZXYk'], - ['clerk.boring.sawfly-91.lcl.dev', 'pk_test_Y2xlcmsuYm9yaW5nLnNhd2ZseS05MS5sY2wuZGV2JA=='], + ['clerk.boring.sawfly-91.lcl.dev', 'pk_test_Y2xlcmsuYm9yaW5nLnNhd2ZseS05MS5sY2wuZGV2JA'], ['clerk.boring.sawfly-91.lclclerk.com', 'pk_test_Y2xlcmsuYm9yaW5nLnNhd2ZseS05MS5sY2xjbGVyay5jb20k'], ]; @@ -36,7 +36,7 @@ describe('parsePublishableKey(key)', () => { ['', null], ['whatever', null], [ - 'pk_live_ZmFrZS1jbGVyay10ZXN0LmNsZXJrLmFjY291bnRzLmRldiQ=', + 'pk_live_ZmFrZS1jbGVyay10ZXN0LmNsZXJrLmFjY291bnRzLmRldiQ', { instanceType: 'production', frontendApi: 'fake-clerk-test.clerk.accounts.dev' }, ], [ diff --git a/packages/shared/src/keys.ts b/packages/shared/src/keys.ts index 9b4ac37a02a..270dcc46e4e 100644 --- a/packages/shared/src/keys.ts +++ b/packages/shared/src/keys.ts @@ -30,17 +30,17 @@ const PUBLISHABLE_KEY_TEST_PREFIX = 'pk_test_'; const PUBLISHABLE_FRONTEND_API_DEV_REGEX = /^(([a-z]+)-){2}([0-9]{1,2})\.clerk\.accounts([a-z.]*)(dev|com)$/i; /** - * Converts a frontend API URL into a base64-encoded publishable key. + * Converts a frontend API URL into an unpadded base64-encoded publishable key. * * @param frontendApi - The frontend API URL (e.g., 'clerk.example.com'). - * @returns A base64-encoded publishable key with appropriate prefix (pk_live_ or pk_test_). + * @returns An unpadded base64-encoded publishable key with appropriate prefix (pk_live_ or pk_test_). */ export function buildPublishableKey(frontendApi: string): string { const isDevKey = PUBLISHABLE_FRONTEND_API_DEV_REGEX.test(frontendApi) || (frontendApi.startsWith('clerk.') && LEGACY_DEV_INSTANCE_SUFFIXES.some(s => frontendApi.endsWith(s))); const keyPrefix = isDevKey ? PUBLISHABLE_KEY_TEST_PREFIX : PUBLISHABLE_KEY_LIVE_PREFIX; - return `${keyPrefix}${isomorphicBtoa(`${frontendApi}$`)}`; + return `${keyPrefix}${isomorphicBtoa(`${frontendApi}$`).replace(/=+$/, '')}`; } /** From 459aa73f7de713a38a1693df0d391dbe133a0aec Mon Sep 17 00:00:00 2001 From: Kevin Wang Date: Fri, 24 Apr 2026 22:21:02 -0400 Subject: [PATCH 2/2] chore: changeset --- .changeset/neat-keys-shine.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/neat-keys-shine.md diff --git a/.changeset/neat-keys-shine.md b/.changeset/neat-keys-shine.md new file mode 100644 index 00000000000..5d9cfa6da88 --- /dev/null +++ b/.changeset/neat-keys-shine.md @@ -0,0 +1,5 @@ +--- +'@clerk/shared': patch +--- + +Generate publishable keys with unpadded Base64 encoding to match backend output.