[ABANDONED] API server for Flexor social network.
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.
 

50 lines
2.0 KiB

// crypto.ts
// Copyright (C) 2020 Dwayne Harris
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import { hash, compare } from 'bcryptjs'
import { randomBytes } from 'crypto'
import jwt, { SignOptions, VerifyOptions } from 'jsonwebtoken'
export const hashPassword = async (password: string) => await hash(password, 8)
export const comparePassword = async (password: string, hash: string) => await compare(password, hash)
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)
})
})
}
}