jwt-utils.ts 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import type { EventHandlerRequest, H3Event } from 'h3';
  2. import jwt from 'jsonwebtoken';
  3. import { UserInfo } from './mock-data';
  4. // TODO: Replace with your own secret key
  5. const ACCESS_TOKEN_SECRET = 'access_token_secret';
  6. const REFRESH_TOKEN_SECRET = 'refresh_token_secret';
  7. export interface UserPayload extends UserInfo {
  8. iat: number;
  9. exp: number;
  10. }
  11. export function generateAccessToken(user: UserInfo) {
  12. return jwt.sign(user, ACCESS_TOKEN_SECRET, { expiresIn: '7d' });
  13. }
  14. export function generateRefreshToken(user: UserInfo) {
  15. return jwt.sign(user, REFRESH_TOKEN_SECRET, {
  16. expiresIn: '30d',
  17. });
  18. }
  19. export function verifyAccessToken(
  20. event: H3Event<EventHandlerRequest>,
  21. ): null | Omit<UserInfo, 'password'> {
  22. const authHeader = getHeader(event, 'Authorization');
  23. if (!authHeader?.startsWith('Bearer')) {
  24. return null;
  25. }
  26. const token = authHeader.split(' ')[1];
  27. try {
  28. const decoded = jwt.verify(token, ACCESS_TOKEN_SECRET) as UserPayload;
  29. const username = decoded.username;
  30. const user = MOCK_USERS.find((item) => item.username === username);
  31. const { password: _pwd, ...userinfo } = user;
  32. return userinfo;
  33. } catch {
  34. return null;
  35. }
  36. }
  37. export function verifyRefreshToken(
  38. token: string,
  39. ): null | Omit<UserInfo, 'password'> {
  40. try {
  41. const decoded = jwt.verify(token, REFRESH_TOKEN_SECRET) as UserPayload;
  42. const username = decoded.username;
  43. const user = MOCK_USERS.find((item) => item.username === username);
  44. const { password: _pwd, ...userinfo } = user;
  45. return userinfo;
  46. } catch {
  47. return null;
  48. }
  49. }