You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
1.4 KiB
40 lines
1.4 KiB
import argon2 from 'argon2'
|
|
import { randomBytes } from 'crypto'
|
|
import jwt, { SignOptions, VerifyOptions } from 'jsonwebtoken'
|
|
|
|
export async function hashPassword(password: string): Promise<string> {
|
|
return await argon2.hash(password)
|
|
}
|
|
|
|
export async function verifyPassword(hash: string, password: string): Promise<boolean> {
|
|
return await argon2.verify(hash, password)
|
|
}
|
|
|
|
export const generateString = (length: number) => randomBytes(Math.max(Math.round(length / 2), 5)).toString('hex')
|
|
|
|
export namespace JWT {
|
|
export interface JWTData {
|
|
sub?: string
|
|
exp?: number
|
|
}
|
|
|
|
export function sign(data: JWTData, options: SignOptions = {}): Promise<string> {
|
|
return new Promise<string>((resolve, reject) => {
|
|
jwt.sign(data, process.env.TOKEN_SECRET!, options, (err, token) => {
|
|
if (err) return reject(err)
|
|
resolve(token)
|
|
})
|
|
})
|
|
}
|
|
|
|
export function verify(token: string, options?: VerifyOptions): Promise<JWTData> {
|
|
return new Promise<JWTData>((resolve, reject) => {
|
|
jwt.verify(token, process.env.TOKEN_SECRET!, options, (err, decoded: JWTData | string) => {
|
|
if (err) return reject(err)
|
|
if (typeof decoded === 'string') return reject('Invalid token')
|
|
|
|
resolve(decoded)
|
|
})
|
|
})
|
|
}
|
|
}
|