brawlset/app/lib/jwt.ts
2024-11-19 00:03:05 +01:00

37 lines
1.2 KiB
TypeScript

import { Buffer } from "buffer"
import { createHmac } from "crypto"
const decode = (str: string):string => Buffer.from(str, 'base64').toString('binary');
const encode = (str: string):string => Buffer.from(str, 'binary').toString('base64');
const secret = process.env.JWT_SECRET ? process.env.JWT_SECRET : ""
interface tokenData {
// eslint-disable-next-line
data: any,
maxAge: number
}
export function createToken({data, maxAge}: tokenData) {
const tokenData = data
tokenData.maxAge = maxAge
const header = encode(JSON.stringify({"alg":"HS256", "typ":"jwt"}))
const body = encode(JSON.stringify(tokenData))
const signature = createHmac('sha256',secret).update(header + "." + body).digest('hex')
return header + "." + body + "." + signature
}
export function validateToken(token: string) {
const rawData = token.split(".")
const header = rawData[0]
const body = rawData[1]
const signature = rawData[2]
const calculatedSignature = createHmac('sha256',secret).update(header + "." + body).digest('hex')
return signature == calculatedSignature
}
export function decryptToken(token: string) {
const rawData = token.split(".")
const body = rawData[1]
return JSON.parse(decode(body))
}