production-evyos-systems-an.../ServicesApi/src/utils/store/loginHandler.ts

65 lines
1.7 KiB
TypeScript

import * as crypto from 'crypto';
import { v4 as uuidv4 } from 'uuid';
interface TokenConfig {
ACCESS_TOKEN_LENGTH: number;
REFRESHER_TOKEN_LENGTH: number;
}
const tokenConfig: TokenConfig = {
ACCESS_TOKEN_LENGTH: 64,
REFRESHER_TOKEN_LENGTH: 128,
};
class PasswordHandlers {
generateRandomUUID(is_string: boolean = true): string {
return is_string ? uuidv4().toString() : uuidv4();
}
create_hashed_password(uuid: string, password: string): string {
const data = `${uuid}:${password}`;
return crypto.createHash('sha256').update(data).digest('hex');
}
createSelectToken(accessToken: string, userUUID: string) {
const data = `${accessToken}:${userUUID}`;
return crypto.createHash('sha256').update(data).digest('hex');
}
check_password(
uuid: string,
password: string,
hashed_password: string,
): boolean {
const created_hashed_password = this.create_hashed_password(uuid, password);
return created_hashed_password === hashed_password;
}
generateAccessToken(): string {
return this.generateToken(tokenConfig.ACCESS_TOKEN_LENGTH);
}
generateRefreshToken(): string {
return this.generateToken(tokenConfig.REFRESHER_TOKEN_LENGTH);
}
generateToken(length: number): string {
const letters = 'abcdefghijklmnopqrstuvwxyz';
const mergedLetters = [...letters, ...letters.toUpperCase().split('')];
let token = crypto.randomBytes(length).toString('base64url');
token = token
.split('')
.map((char) =>
mergedLetters.includes(char)
? char
: mergedLetters[Math.floor(Math.random() * mergedLetters.length)],
)
.join('');
return token;
}
}
export { PasswordHandlers };