mirror of
https://github.com/vercel/commerce.git
synced 2025-05-13 05:07:51 +00:00
49 lines
1.5 KiB
TypeScript
49 lines
1.5 KiB
TypeScript
// @ts-nocheck
|
|
export async function generateCodeVerifier() {
|
|
const randomCode = generateRandomCode();
|
|
return base64UrlEncode(randomCode);
|
|
}
|
|
export async function generateCodeChallenge(codeVerifier: string) {
|
|
const digestOp = await crypto.subtle.digest(
|
|
{ name: 'SHA-256' },
|
|
new TextEncoder().encode(codeVerifier)
|
|
);
|
|
const hash = convertBufferToString(digestOp);
|
|
return base64UrlEncode(hash);
|
|
}
|
|
function generateRandomCode() {
|
|
const array = new Uint8Array(32);
|
|
crypto.getRandomValues(array);
|
|
return String.fromCharCode.apply(null, Array.from(array));
|
|
}
|
|
function base64UrlEncode(str: string) {
|
|
const base64 = btoa(str);
|
|
// This is to ensure that the encoding does not have +, /, or = characters in it.
|
|
return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
|
|
}
|
|
function convertBufferToString(hash: ArrayBuffer) {
|
|
const uintArray = new Uint8Array(hash);
|
|
const numberArray = Array.from(uintArray);
|
|
return String.fromCharCode(...numberArray);
|
|
}
|
|
|
|
export async function generateRandomString() {
|
|
const timestamp = Date.now().toString();
|
|
const randomString = Math.random().toString(36).substring(2);
|
|
return timestamp + randomString;
|
|
}
|
|
|
|
export async function getNonce(token: string) {
|
|
return decodeJwt(token).payload.nonce;
|
|
}
|
|
function decodeJwt(token: string) {
|
|
const [header, payload, signature] = token.split('.');
|
|
const decodedHeader = JSON.parse(atob(header || ''));
|
|
const decodedPayload = JSON.parse(atob(payload || ''));
|
|
return {
|
|
header: decodedHeader,
|
|
payload: decodedPayload,
|
|
signature
|
|
};
|
|
}
|