weapp_auth2.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. module.exports = (options, app) => {
  2. return async function wechatAuth2(ctx, next) {
  3. const traceId = ctx.logId ||
  4. `${Date.now()}-${Math.random().toString(16).slice(2)}`;
  5. const startTime = Date.now();
  6. ctx.logger.warn(
  7. '[WEAPP_TRACE] id=%s start method=%s url=%s',
  8. traceId,
  9. ctx.method,
  10. ctx.originalUrl
  11. );
  12. const token =
  13. ctx.headers.authorization &&
  14. ctx.headers.authorization.replace('Bearer ', '');
  15. const code = ctx.headers['platform-code'];
  16. if (!token || !code) {
  17. ctx.logger.warn(
  18. '[WEAPP_TRACE] id=%s auth_failed reason=missing_token_or_code cost=%dms',
  19. traceId,
  20. Date.now() - startTime
  21. );
  22. ctx.body = {
  23. code: 2,
  24. msg: '请登录',
  25. data: null,
  26. };
  27. return;
  28. }
  29. try {
  30. const decoded = jwt.verify(
  31. token,
  32. weappConfig.jwtSecret
  33. );
  34. ctx.logger.warn(
  35. '[WEAPP_TRACE] id=%s jwt_done cost=%dms',
  36. traceId,
  37. Date.now() - startTime
  38. );
  39. const projectData =
  40. await ctx.service.project.getProjectByCode(
  41. code.trim()
  42. );
  43. ctx.logger.warn(
  44. '[WEAPP_TRACE] id=%s project_done cost=%dms',
  45. traceId,
  46. Date.now() - startTime
  47. );
  48. if (projectData === null) {
  49. throw '不存在项目数据';
  50. }
  51. const projectAccount =
  52. await ctx.service.projectAccount.getDataByCondition({
  53. weapp_openid: decoded.openid,
  54. project_id: projectData.id,
  55. enable: 1,
  56. });
  57. ctx.logger.warn(
  58. '[WEAPP_TRACE] id=%s account_done cost=%dms',
  59. traceId,
  60. Date.now() - startTime
  61. );
  62. if (!projectAccount) {
  63. throw '账号不存在或未启用';
  64. }
  65. ctx.session.sessionUser = {
  66. ...projectAccount,
  67. accountId: projectAccount.id,
  68. };
  69. ctx.session.sessionProject = projectData;
  70. } catch (error) {
  71. ctx.logger.error(
  72. '[WEAPP_TRACE] id=%s auth_error url=%s cost=%dms',
  73. traceId,
  74. ctx.originalUrl,
  75. Date.now() - startTime,
  76. error
  77. );
  78. if (error.name === 'TokenExpiredError') {
  79. ctx.body = {
  80. code: 2,
  81. msg: '登陆凭证过期,请重新登陆',
  82. data: null,
  83. };
  84. return;
  85. }
  86. ctx.body = {
  87. code: -1,
  88. msg: error.toString() || '请登录',
  89. data: null,
  90. };
  91. return;
  92. }
  93. ctx.logger.warn(
  94. '[WEAPP_TRACE] id=%s auth_done controller_start cost=%dms',
  95. traceId,
  96. Date.now() - startTime
  97. );
  98. try {
  99. await next();
  100. } finally {
  101. ctx.logger.warn(
  102. '[WEAPP_TRACE] id=%s request_end status=%s cost=%dms url=%s',
  103. traceId,
  104. ctx.status,
  105. Date.now() - startTime,
  106. ctx.originalUrl
  107. );
  108. }
  109. };
  110. }