Przeglądaj źródła

feat(weapp): 添加weapp_auth2中间件以增强认证功能

lanjianrong 1 dzień temu
rodzic
commit
aa2a4cb8de
2 zmienionych plików z 130 dodań i 1 usunięć
  1. 129 0
      app/middleware/weapp_auth2.js
  2. 1 1
      app/router.js

+ 129 - 0
app/middleware/weapp_auth2.js

@@ -0,0 +1,129 @@
+module.exports = (options, app) => {
+return async function wechatAuth2(ctx, next) {
+    const traceId = ctx.logId ||
+        `${Date.now()}-${Math.random().toString(16).slice(2)}`;
+    const startTime = Date.now();
+
+    ctx.logger.warn(
+        '[WEAPP_TRACE] id=%s start method=%s url=%s',
+        traceId,
+        ctx.method,
+        ctx.originalUrl
+    );
+
+    const token =
+        ctx.headers.authorization &&
+        ctx.headers.authorization.replace('Bearer ', '');
+
+    const code = ctx.headers['platform-code'];
+
+    if (!token || !code) {
+        ctx.logger.warn(
+            '[WEAPP_TRACE] id=%s auth_failed reason=missing_token_or_code cost=%dms',
+            traceId,
+            Date.now() - startTime
+        );
+
+        ctx.body = {
+            code: 2,
+            msg: '请登录',
+            data: null,
+        };
+        return;
+    }
+
+    try {
+        const decoded = jwt.verify(
+            token,
+            weappConfig.jwtSecret
+        );
+
+        ctx.logger.warn(
+            '[WEAPP_TRACE] id=%s jwt_done cost=%dms',
+            traceId,
+            Date.now() - startTime
+        );
+
+        const projectData =
+            await ctx.service.project.getProjectByCode(
+                code.trim()
+            );
+
+        ctx.logger.warn(
+            '[WEAPP_TRACE] id=%s project_done cost=%dms',
+            traceId,
+            Date.now() - startTime
+        );
+
+        if (projectData === null) {
+            throw '不存在项目数据';
+        }
+
+        const projectAccount =
+            await ctx.service.projectAccount.getDataByCondition({
+                weapp_openid: decoded.openid,
+                project_id: projectData.id,
+                enable: 1,
+            });
+
+        ctx.logger.warn(
+            '[WEAPP_TRACE] id=%s account_done cost=%dms',
+            traceId,
+            Date.now() - startTime
+        );
+
+        if (!projectAccount) {
+            throw '账号不存在或未启用';
+        }
+
+        ctx.session.sessionUser = {
+            ...projectAccount,
+            accountId: projectAccount.id,
+        };
+
+        ctx.session.sessionProject = projectData;
+    } catch (error) {
+        ctx.logger.error(
+            '[WEAPP_TRACE] id=%s auth_error url=%s cost=%dms',
+            traceId,
+            ctx.originalUrl,
+            Date.now() - startTime,
+            error
+        );
+
+        if (error.name === 'TokenExpiredError') {
+            ctx.body = {
+                code: 2,
+                msg: '登陆凭证过期,请重新登陆',
+                data: null,
+            };
+            return;
+        }
+
+        ctx.body = {
+            code: -1,
+            msg: error.toString() || '请登录',
+            data: null,
+        };
+        return;
+    }
+
+    ctx.logger.warn(
+        '[WEAPP_TRACE] id=%s auth_done controller_start cost=%dms',
+        traceId,
+        Date.now() - startTime
+    );
+
+    try {
+        await next();
+    } finally {
+        ctx.logger.warn(
+            '[WEAPP_TRACE] id=%s request_end status=%s cost=%dms url=%s',
+            traceId,
+            ctx.status,
+            Date.now() - startTime,
+            ctx.originalUrl
+        );
+    }
+};
+}

+ 1 - 1
app/router.js

@@ -65,7 +65,7 @@ module.exports = app => {
     const safeInspectionCheck = app.middlewares.safeInspectionCheck();
     const safeStageCheck = app.middlewares.safeStageCheck();
     // weapp中间件
-    const weappAuth = app.middlewares.weappAuth();
+    const weappAuth = app.middlewares.weappAuth2();
     const weappTenderCheck = app.middlewares.weappTenderCheck();
     // 登入登出相关
     app.get('/login', 'loginController.index');