Переглянути джерело

feat: 更新weapp登录逻辑,调整返回数据结构及错误处理信息

lanjianrong 4 місяців тому
батько
коміт
8945781801
4 змінених файлів з 57 додано та 30 видалено
  1. 14 5
      app/controller/weapp_controller.js
  2. 25 5
      app/middleware/weapp_auth.js
  3. 4 2
      app/router.js
  4. 14 18
      app/service/weapp.js

+ 14 - 5
app/controller/weapp_controller.js

@@ -18,7 +18,7 @@ module.exports = app => {
                     throw '缺少必要参数';
                 }
                 const { accessToken, refreshToken, pList } = await ctx.service.weapp.accountlogin({ code, account, password });
-                ctx.body = { code: 0, msg: '登录成功', data: { access_token: accessToken, refresh_token: refreshToken, projects: pList } };
+                ctx.body = { code: 0, msg: '登录成功', data: { access_token: accessToken, refresh_token: refreshToken, platformProjects: pList } };
             } catch (error) {
                 this.log(error);
                 ctx.body = { code: -1, msg: error.toString(), data: null };
@@ -34,7 +34,7 @@ module.exports = app => {
                     throw '微信授权失败, 请检查';
                 }
                 const { accessToken, refreshToken, pList } = await ctx.service.weapp.weappLogin(code);
-                ctx.body = { code: 0, msg: '登录成功', data: { access_token: accessToken, refresh_token: refreshToken, projects: pList } };
+                ctx.body = { code: 0, msg: '登录成功', data: { access_token: accessToken, refresh_token: refreshToken, platformProjects: pList } };
             } catch (error) {
                 this.log(error);
                 ctx.body = { code: -1, msg: error.toString(), data: null };
@@ -85,21 +85,30 @@ module.exports = app => {
                 ctx.body = { code: 0, msg: '', data: { access_token: token } };
             } catch (error) {
                 this.log(error);
-                ctx.body = { code: -1, msg: '', data: null };
+                ctx.body = { code: -1, msg: '登陆已过期,请重新登录', data: null };
             }
         }
 
         // 获取用户信息
         async getUserInfo(ctx) {
             try {
-                const userInfo = await ctx.service.weapp.getUserInfo();
-                ctx.body = { code: 0, msg: '', data: userInfo };
+                const mobile = ctx.projectAccount.auth_mobile || ctx.projectAccount.mobile;
+                const projectAccount = {
+                    code: ctx.project.code,
+                    name: ctx.project.name,
+                    userName: ctx.projectAccount.name,
+                    mobile: mobile.slice(0, 3) + '****' + mobile.slice(-4),
+                };
+                ctx.body = { code: 0, msg: '', data: {
+                    userInfo: projectAccount,
+                } };
             } catch (error) {
                 this.log(error);
                 ctx.body = { code: -1, msg: '', data: null };
             }
         }
 
+
     }
     return WeappController;
 };

+ 25 - 5
app/middleware/weapp_auth.js

@@ -5,14 +5,34 @@ module.exports = (options, app) => {
 
     return async function wechatAuth(ctx, next) {
         const token = ctx.headers.authorization && ctx.headers.authorization.replace('Bearer ', '');
-        if (!token) return ctx.fail(401, '请登录');
+        console.log('1111');
+        const code = ctx.headers['platform-code'];
+        if (!token || !code) return ctx.fail(401, '请登录');
         try {
             const decoded = jwt.verify(token, weappConfig.jwtSecret);
-            const accountInfo = await ctx.service.projectAccount.getDataById(decoded.accountId);
-            ctx.accountInfo = accountInfo;
+            const projectData = await ctx.service.project.getProjectByCode(
+                code.trim()
+            );
+            if (projectData === null) {
+                throw '不存在项目数据';
+            }
+
+            const projectAccount = await ctx.service.projectAccount.getDataByCondition({
+                wx_openid: decoded.openid,
+                project_id: projectData.id,
+                enable: 1,
+            });
+            if (!projectAccount) {
+                throw '账号不存在或未启用';
+            }
+            ctx.projectAccount = projectAccount;
+            ctx.project = projectData;
         } catch (error) {
-            console.log(error);
-            ctx.body = error;
+            if (error.name === 'TokenExpiredError') {
+                ctx.body = { code: 2, msg: '', data: null };
+                return;
+            }
+            ctx.body = { code: -1, msg: error.toString() || '请登录', data: null };
             return;
         }
         await next();

+ 4 - 2
app/router.js

@@ -64,6 +64,8 @@ module.exports = app => {
     // 安全巡检中间件
     const safeInspectionCheck = app.middlewares.safeInspectionCheck();
     const safeStageCheck = app.middlewares.safeStageCheck();
+    // weapp中间件
+    const weappAuth = app.middlewares.weappAuth();
     // 登入登出相关
     app.get('/login', 'loginController.index');
     app.get('/login/:code', 'loginController.index');
@@ -1233,10 +1235,10 @@ module.exports = app => {
     app.get('/wx/tips', 'wechatController.tips');
 
     // weapp
-    app.post('/wx/weapp/accountLogin', 'weappController.accountLogin');
+    app.post('/wx/weapp/accountLogin', 'weappController.accountLogin'); // 测试用,正式环境要删除
     app.post('/wx/weapp/wxLogin', 'weappController.wxLogin');
-    app.post('/wx/weapp/mobileLogin', 'weappController.mobileLogin');
     app.get('/wx/weapp/getCaptcha', 'weappController.getCaptcha');
     app.get('/wx/weapp/refresh', 'weappController.refresh');
+    app.get('/wx/weapp/userInfo', weappAuth, 'weappController.getUserInfo');
 
 };

+ 14 - 18
app/service/weapp.js

@@ -35,8 +35,9 @@ module.exports = app => {
             if (!isPasswordValid) {
                 throw '帐号或密码错误';
             }
-            const paList = await this.ctx.service.projectAccount.getAllDataByCondition({ where: { wx_openid: projectAccount.openid } });
+            const paList = await this.ctx.service.projectAccount.getAllDataByCondition({ where: { wx_openid: projectAccount.wx_openid } });
             const pidList = this.ctx.app._.uniq(this.ctx.app._.map(paList, 'project_id'));
+
             const pList = [];
             for (const p of pidList) {
                 const project = await this.ctx.service.project.getDataById(p);
@@ -49,19 +50,20 @@ module.exports = app => {
             }
 
             const accessToken = jwt.sign(
-                { accountId: projectAccount.openid, type: 'access' },
+                { openid: projectAccount.openid, type: 'access' },
                 weappConfig.jwtSecret,
                 { expiresIn: weappConfig.accessTokenExpiresIn }
             );
 
             const refreshToken = jwt.sign(
-                { accountId: projectAccount.openid, type: 'refresh' },
+                { openid: projectAccount.openid, type: 'refresh' },
                 weappConfig.jwtSecret,
                 { expiresIn: weappConfig.refreshTokenExpiresIn }
             );
                 // 3. 存入 Redis:pid 对应最新 refreshToken
             const key = `user:${projectAccount.openid}:refresh_token`;
             await app.redis.set(key, refreshToken, 'EX', weappConfig.redisExpire);
+
             return { accessToken, refreshToken, pList };
         }
 
@@ -78,8 +80,6 @@ module.exports = app => {
                 });
 
                 const { openid, errcode } = wxRes.data;
-                console.log('openid', openid);
-
 
                 if (errcode || !openid) throw '微信授权登录失败';
 
@@ -98,19 +98,20 @@ module.exports = app => {
 
                 // 2. 生成 access_token + refresh_token
                 const accessToken = jwt.sign(
-                    { accountId: openid, type: 'access' },
+                    { openid, type: 'access' },
                     weappConfig.jwtSecret,
                     { expiresIn: weappConfig.accessTokenExpiresIn }
                 );
 
                 const refreshToken = jwt.sign(
-                    { accountId: openid, type: 'refresh' },
+                    { openid, type: 'refresh' },
                     weappConfig.jwtSecret,
                     { expiresIn: weappConfig.refreshTokenExpiresIn }
                 );
                 // 3. 存入 Redis:pid 对应最新 refreshToken
                 const key = `user:${openid}:refresh_token`;
                 await app.redis.set(key, refreshToken, 'EX', weappConfig.redisExpire);
+
                 return { accessToken, refreshToken, pList };
             } catch (error) {
                 throw error.toString();
@@ -131,18 +132,18 @@ module.exports = app => {
                 throw '验证码错误或已过期';
             }
             const accessToken = jwt.sign(
-                { accountId: projectAccount.id, type: 'access' },
+                { openid: projectAccount.wx_openid, type: 'access' },
                 weappConfig.jwtSecret,
                 { expiresIn: weappConfig.accessTokenExpiresIn }
             );
 
             const refreshToken = jwt.sign(
-                { accountId: projectAccount.id, type: 'refresh' },
+                { openid: projectAccount.wx_openid, type: 'refresh' },
                 weappConfig.jwtSecret,
                 { expiresIn: weappConfig.refreshTokenExpiresIn }
             );
                 // 3. 存入 Redis:pid 对应最新 refreshToken
-            const key = `user:${projectAccount.id}:refresh_token`;
+            const key = `user:${projectAccount.wx_openid}:refresh_token`;
             await app.redis.set(key, refreshToken, 'EX', weappConfig.redisExpire);
             return { accessToken, refreshToken };
         }
@@ -170,22 +171,17 @@ module.exports = app => {
             if (decoded.type !== 'refresh') {
                 throw 'token 类型错误';
             }
-            const { accountId } = decoded;
+            const { openid } = decoded;
             // 2. 校验 Redis 中是否存在(防止篡改/过期/被踢)
-            const redisKey = `user:${accountId}:refresh_token`;
+            const redisKey = `user:${openid}:refresh_token`;
             const redisRefreshToken = await app.redis.get(redisKey);
             if (!redisRefreshToken || redisRefreshToken !== refreshToken) {
                 throw 'refresh_token 无效或已过期';
             }
-            const newAccessToken = jwt.sign({ accountId, type: 'access' }, weappConfig.jwtSecret, { expiresIn: weappConfig.accessTokenExpiresIn });
+            const newAccessToken = jwt.sign({ openid, type: 'access' }, weappConfig.jwtSecret, { expiresIn: weappConfig.accessTokenExpiresIn });
             return newAccessToken;
         }
 
-        // 获取用户信息以及参与的标段等
-        async getUserInfo() {
-            const accountInfo = this.ctx.accountInfo;
-
-        }
     }
     return Weappchat;
 };