65 lines
1.7 KiB
TypeScript
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 };
|