UNPKG

@wristband/nextjs-auth

Version:

SDK for integrating your NextJS application with Wristband. Handles user authentication and token management.

44 lines (43 loc) 1.74 kB
import { defaults, seal, unseal } from 'iron-webcrypto'; import * as crypto from 'uncrypto'; export function encodeBase64(input) { const encoder = new TextEncoder(); const data = encoder.encode(input); let binary = ''; data.forEach((byte) => { binary += String.fromCharCode(byte); }); return btoa(binary); } export function base64ToURLSafe(str) { return str.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); } export function generateRandomString(length) { const randomValues = new Uint8Array(length); crypto.getRandomValues(randomValues); const base64String = btoa(String.fromCharCode(...randomValues)); return base64String.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); } export async function sha256Base64(input) { const encoder = new TextEncoder(); const data = encoder.encode(input); const hashBuffer = await crypto.subtle.digest('SHA-256', data); const hashArray = Array.from(new Uint8Array(hashBuffer)); const hashString = hashArray .map((byte) => { return String.fromCharCode(byte); }) .join(''); return btoa(hashString); } export async function encryptLoginState(loginState, loginStateSecret) { const encryptedLoginState = await seal(crypto, loginState, loginStateSecret, defaults); if (encryptedLoginState.length > 4096) { throw new TypeError('Login state cookie exceeds 4kB in size. Ensure your [customState] and [returnUrl] values are a reasonable size.'); } return encryptedLoginState; } export async function decryptLoginState(loginStateCookie, loginStateSecret) { const loginState = await unseal(crypto, loginStateCookie, loginStateSecret, defaults); return loginState; }