weapp_auth.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. 'use strict';
  2. const weappConfig = require('../const/weapp');
  3. const jwt = require('jsonwebtoken');
  4. module.exports = (options, app) => {
  5. return async function wechatAuth(ctx, next) {
  6. const token = ctx.headers.authorization && ctx.headers.authorization.replace('Bearer ', '');
  7. const code = ctx.headers['platform-code'];
  8. if (!token || !code) {
  9. ctx.body = { code: 2, msg: '请登录', data: null };
  10. return;
  11. }
  12. try {
  13. const decoded = jwt.verify(token, weappConfig.jwtSecret);
  14. const projectData = await ctx.service.project.getProjectByCode(
  15. code.trim()
  16. );
  17. if (projectData === null) {
  18. throw '不存在项目数据';
  19. }
  20. const projectAccount = await ctx.service.projectAccount.getDataByCondition({
  21. wx_openid: decoded.openid,
  22. project_id: projectData.id,
  23. enable: 1,
  24. });
  25. if (!projectAccount) {
  26. throw '账号不存在或未启用';
  27. }
  28. ctx.session.sessionUser = { ...projectAccount, accountId: projectAccount.id };
  29. ctx.session.sessionProject = projectData;
  30. } catch (error) {
  31. if (error.name === 'TokenExpiredError') {
  32. ctx.body = { code: 2, msg: '登陆凭证过期,请重新登陆', data: null };
  33. return;
  34. }
  35. ctx.body = { code: -1, msg: error.toString() || '请登录', data: null };
  36. return;
  37. }
  38. await next();
  39. };
  40. };