/ support / ebsSupport / token.mjs
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  }