auth.service.ts 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import jwt from 'jsonwebtoken';
  2. import { UserService } from '../users/user.service';
  3. import { UserEntity as User } from '../users/user.entity';
  4. const JWT_SECRET = 'your-secret-key'; // 生产环境应使用环境变量
  5. const JWT_EXPIRES_IN = '7d'; // 7天有效期
  6. export class AuthService {
  7. private userService: UserService;
  8. constructor(userService: UserService) {
  9. this.userService = userService;
  10. }
  11. async login(username: string, password: string): Promise<{ token: string; user: User }> {
  12. try {
  13. const user = await this.userService.getUserByUsername(username);
  14. if (!user) {
  15. throw new Error('User not found');
  16. }
  17. const isPasswordValid = await this.userService.verifyPassword(user, password);
  18. if (!isPasswordValid) {
  19. throw new Error('Invalid password');
  20. }
  21. const token = this.generateToken(user);
  22. return { token, user };
  23. } catch (error) {
  24. console.error('Login error:', error);
  25. throw error;
  26. }
  27. }
  28. generateToken(user: User): string {
  29. const payload = {
  30. id: user.id,
  31. username: user.username,
  32. roles: user.roles?.map(role => role.name) || []
  33. };
  34. return jwt.sign(payload, JWT_SECRET, { expiresIn: JWT_EXPIRES_IN });
  35. }
  36. verifyToken(token: string): any {
  37. try {
  38. return jwt.verify(token, JWT_SECRET);
  39. } catch (error) {
  40. console.error('Token verification failed:', error);
  41. throw new Error('Invalid token');
  42. }
  43. }
  44. async logout(token: string): Promise<void> {
  45. try {
  46. // 验证token有效性
  47. const decoded = this.verifyToken(token);
  48. if (!decoded) {
  49. throw new Error('Invalid token');
  50. }
  51. // 实际项目中这里可以添加token黑名单逻辑
  52. // 或者调用Redis等缓存服务使token失效
  53. return Promise.resolve();
  54. } catch (error) {
  55. console.error('Logout failed:', error);
  56. throw error;
  57. }
  58. }
  59. }