@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
JavaScript
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;
}