4 lines
659 B
JavaScript
4 lines
659 B
JavaScript
import {createHash} from 'node:crypto';
|
|
import {EncryptJWT,jwtDecrypt} from 'jose';
|
|
export function sessionCodec(secret,clientId){if(!secret||secret.length<16)throw new Error('A confidential Keycloak client secret is required');const key=createHash('sha256').update(`character-session-v1:${clientId}:${secret}`).digest();return {seal:async(payload,seconds=43200)=>new EncryptJWT(payload).setProtectedHeader({alg:'dir',enc:'A256GCM'}).setIssuedAt().setExpirationTime(`${seconds}s`).encrypt(key),open:async(token)=>{try{return (await jwtDecrypt(token,key,{keyManagementAlgorithms:['dir'],contentEncryptionAlgorithms:['A256GCM']})).payload}catch{return null}}}}
|