auth-utils.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import bcrypt from 'bcryptjs';
  2. import jwt from 'jsonwebtoken';
  3. import { randomBytes } from 'crypto';
  4. // 密码哈希
  5. export async function hashPassword(password: string): Promise<string> {
  6. const saltRounds = 12;
  7. return bcrypt.hash(password, saltRounds);
  8. }
  9. // 验证密码
  10. export async function verifyPassword(password: string, hashedPassword: string): Promise<boolean> {
  11. return bcrypt.compare(password, hashedPassword);
  12. }
  13. // 生成验证令牌
  14. export function generateVerificationToken(): string {
  15. return randomBytes(32).toString('hex');
  16. }
  17. // 生成JWT令牌
  18. export function generateJWT(payload: any, expiresIn: string = '7d'): string {
  19. const secret = process.env.JWT_SECRET;
  20. if (!secret) {
  21. throw new Error('JWT_SECRET 环境变量未设置');
  22. }
  23. return jwt.sign(payload, secret, { expiresIn } as any);
  24. }
  25. // 验证JWT令牌
  26. export function verifyJWT(token: string): any {
  27. try {
  28. const secret = process.env.JWT_SECRET;
  29. if (!secret) {
  30. throw new Error('JWT_SECRET 环境变量未设置');
  31. }
  32. return jwt.verify(token, secret);
  33. } catch (error) {
  34. return null;
  35. }
  36. }
  37. // 生成过期时间
  38. export function generateExpirationTime(hours: number = 24): Date {
  39. return new Date(Date.now() + hours * 60 * 60 * 1000);
  40. }
  41. // 验证邮箱格式
  42. export function isValidEmail(email: string): boolean {
  43. const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  44. return emailRegex.test(email);
  45. }