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 {