37 lines
1.2 KiB
TypeScript
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))
|
|
}
|