token.mjs
1 import * as crypto from "node:crypto" 2 3 function replaceSpecialChars(b64string) { 4 return b64string.replace(/[=+/]/g, charToBeReplaced => { 5 switch (charToBeReplaced) { 6 case "=": 7 return "" 8 case "+": 9 return "-" 10 case "/": 11 return "_" 12 } 13 }) 14 } 15 16 function createSignature(header, payload, secret) { 17 let signature = crypto.createHmac("sha256", Buffer.from(secret, "base64")) 18 signature.update(`${header}.${payload}`) 19 signature = signature.digest("base64") 20 signature = replaceSpecialChars(signature) 21 return signature 22 } 23 24 export function VerifyJWT(token, key) { 25 if (!token) return false 26 27 const [header, payload, signature] = token.split(".") 28 let compare = crypto.createHmac("sha256", Buffer.from(key, "base64")) 29 30 compare.update(`${header}.${payload}`) 31 compare = compare.digest("base64") 32 compare = replaceSpecialChars(compare) 33 34 return compare == signature 35 } 36 37 export function SignJWT(payload, secret) { 38 const header = { alg: "HS256", typ: "JWT" } 39 , b64Header = replaceSpecialChars(Buffer.from(JSON.stringify(header)).toString("base64")) 40 , b64Payload = replaceSpecialChars(Buffer.from(JSON.stringify(payload)).toString("base64")) 41 , signature = createSignature(b64Header, b64Payload, secret) 42 return `${b64Header}.${b64Payload}.${signature}` 43 }