auth.service.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import * as jwt from 'jsonwebtoken';
  2. import { UserService } from '../users/user.service';
  3. import { User } from '../users/user.entity';
  4. const JWT_SECRET = 'your-secret-key'; // 生产环境应使用环境变量
  5. const JWT_EXPIRES_IN = '1h';
  6. export class AuthService {
  7. private userService: UserService;
  8. constructor() {
  9. this.userService = new 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. // 实际项目中可能需要将token加入黑名单
  46. // 这里简单返回成功
  47. return Promise.resolve();
  48. }
  49. }