auth.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. exports.authMiddleware = authMiddleware;
  7. exports.optionalAuth = optionalAuth;
  8. const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
  9. const config_1 = require("../config");
  10. const errorHandler_1 = require("./errorHandler");
  11. async function authMiddleware(ctx, next) {
  12. const authHeader = ctx.get('Authorization');
  13. if (!authHeader) {
  14. throw new errorHandler_1.UnauthorizedError('缺少 Authorization 头');
  15. }
  16. const parts = authHeader.split(' ');
  17. if (parts.length !== 2 || parts[0] !== 'Bearer') {
  18. throw new errorHandler_1.UnauthorizedError('Authorization 格式错误');
  19. }
  20. const token = parts[1];
  21. try {
  22. // 使用硬编码的secret,确保和generateToken一致
  23. const secret = 'my-jwt-secret-key-2024';
  24. const payload = jsonwebtoken_1.default.verify(token, secret);
  25. ctx.state.user = payload;
  26. await next();
  27. }
  28. catch (err) {
  29. const error = err;
  30. if (error.name === 'TokenExpiredError') {
  31. throw new errorHandler_1.UnauthorizedError('Token 已过期');
  32. }
  33. if (error.name === 'JsonWebTokenError') {
  34. throw new errorHandler_1.UnauthorizedError('Token 无效');
  35. }
  36. throw new errorHandler_1.AppError('认证失败', 401, 401);
  37. }
  38. }
  39. // 可选认证(允许未登录访问)
  40. async function optionalAuth(ctx, next) {
  41. const authHeader = ctx.get('Authorization');
  42. if (authHeader) {
  43. const parts = authHeader.split(' ');
  44. if (parts.length === 2 && parts[0] === 'Bearer') {
  45. try {
  46. const payload = jsonwebtoken_1.default.verify(parts[1], config_1.config.jwt.secret);
  47. ctx.state.user = payload;
  48. }
  49. catch {
  50. // 忽略错误,继续执行
  51. }
  52. }
  53. }
  54. await next();
  55. }