From 7ffbebc87c62007dc335cabee92d6622c48a5053 Mon Sep 17 00:00:00 2001 From: Richard Lee <14349+dlackty@users.noreply.github.com> Date: Mon, 8 Jan 2024 01:30:56 +0800 Subject: [PATCH] Fix unicode payload signing --- src/index.spec.ts | 10 ++++++++++ src/index.ts | 5 ++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/index.spec.ts b/src/index.spec.ts index 094f76d..b9fe6a0 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -73,6 +73,11 @@ const payload: Payload = { name: "John Doe", } +const unicodePayload: Payload = { + sub: "1234567890", + name: "John Doe 😎", +} + describe.each(Object.entries(data) as [JwtAlgorithm, Dataset][])('%s', (algorithm, data) => { let token = '' @@ -97,6 +102,11 @@ describe.each(Object.entries(data) as [JwtAlgorithm, Dataset][])('%s', (algorith expect(token).toMatch(/^[a-zA-Z0-9\-_]+\.[a-zA-Z0-9\-_]+\.[a-zA-Z0-9\-_]+$/) }) + test('sign unciode', async () => { + token = await jwt.sign(unicodePayload, data.private, algorithm) + expect(token).toMatch(/^[a-zA-Z0-9\-_]+\.[a-zA-Z0-9\-_]+\.[a-zA-Z0-9\-_]+$/) + }) + test('decode internal', async () => { const decoded = jwt.decode(token) expect({ diff --git a/src/index.ts b/src/index.ts index 8785a73..a3a9452 100644 --- a/src/index.ts +++ b/src/index.ts @@ -157,7 +157,10 @@ function base64UrlToArrayBuffer(b64url: string): ArrayBuffer { } function textToBase64Url(str: string): string { - return btoa(str).replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_') + const encoder = new TextEncoder(); + const charCodes = encoder.encode(str); + const binaryStr = String.fromCharCode(...charCodes); + return btoa(binaryStr).replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_') } function pemToBinary(pem: string): ArrayBuffer {