From 76633e67a6517574e5af316509a409162be202c1 Mon Sep 17 00:00:00 2001 From: luying Date: Fri, 25 Nov 2022 17:18:38 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(=E5=90=8E=E5=8F=B0):=2037sdk?= =?UTF-8?q?=E9=9C=80=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gm-server/app/controller/gmaccount.ts | 4 +-- gm-server/app/controller/login.ts | 13 +++++++ gm-server/app/middleware/tokenParser.ts | 8 ++++- gm-server/app/router.ts | 1 + gm-server/app/service/GmUser.ts | 45 +++++++++++++++++++++++-- shared/consts/constModules/httpConst.ts | 1 + shared/consts/statusCode.ts | 10 ++++++ shared/db/GMUser.ts | 18 ++++++++-- shared/pubUtils/sdkUtil.ts | 8 +++++ 9 files changed, 99 insertions(+), 9 deletions(-) diff --git a/gm-server/app/controller/gmaccount.ts b/gm-server/app/controller/gmaccount.ts index a8b63a7f5..9376a3c88 100644 --- a/gm-server/app/controller/gmaccount.ts +++ b/gm-server/app/controller/gmaccount.ts @@ -43,7 +43,7 @@ export default class GmController extends Controller { public async saveGmGroupToUser() { const { ctx } = this; - const {uid, group, env, isEnable} = ctx.request.body; - ctx.body = await ctx.service.gmUser.saveGmGroupToUser(uid, group, env, isEnable); + const {uid, group, env, isEnable, type} = ctx.request.body; + ctx.body = await ctx.service.gmUser.saveGmGroupToUser(uid, group, env, isEnable, type); } } diff --git a/gm-server/app/controller/login.ts b/gm-server/app/controller/login.ts index 43f776579..595c50701 100644 --- a/gm-server/app/controller/login.ts +++ b/gm-server/app/controller/login.ts @@ -1,3 +1,4 @@ +import { BACKEND_37_CODE } from '@consts'; import { Controller } from 'egg'; export default class LoginController extends Controller { @@ -13,6 +14,18 @@ export default class LoginController extends Controller { ctx.body = await ctx.service.gmUser.currentUser(); } + public async channelLogin() { + const { ctx } = this; + const { uname, time, sign } = ctx.query; + + let result = await ctx.service.gmUser.channelLogin(uname, time, sign); + if(result.code == BACKEND_37_CODE.SUCCESS.code) { + ctx.redirect(`/welcome?token=${result.data.token}`); + } else { + ctx.body = result.code; + } + } + public async changeMyPass() { const { ctx } = this; const {uid, password} = ctx.request.body; diff --git a/gm-server/app/middleware/tokenParser.ts b/gm-server/app/middleware/tokenParser.ts index 6db8a76db..1b3cb791e 100644 --- a/gm-server/app/middleware/tokenParser.ts +++ b/gm-server/app/middleware/tokenParser.ts @@ -3,13 +3,14 @@ import { GMGroupModel } from '@db/GMGroup' import { GMRecordModel } from '@db/GMRecord' import { GM_API_TYPE, STATUS } from '@consts'; import { gameData } from '@pubUtils/data'; +import { nowSeconds } from '@pubUtils/timeUtil'; module.exports = () => { return async function tokenParser(ctx, next) { if (!ctx.request.headers || !ctx.request.headers.token) { console.error('token not found'); - ctx.body = ctx.service.utils.resResult(STATUS.WRONG_PARMS); + ctx.body = ctx.service.utils.resResult(STATUS.TOKEN_ERR); return; } const user = await GMUserModel.getGmAccountByToken(ctx.request.headers.token); @@ -18,6 +19,11 @@ module.exports = () => { ctx.body = ctx.service.utils.resResult(STATUS.TOKEN_ERR); return; } + if((user?.expireTime||0) < nowSeconds()) { + ctx.body = ctx.service.utils.resResult(STATUS.TOKEN_ERR); + return; + } + const url = ctx.request.url; let dicApi = gameData.apiByUrl.get(url); if(!dicApi) { diff --git a/gm-server/app/router.ts b/gm-server/app/router.ts index 92b010227..453643233 100644 --- a/gm-server/app/router.ts +++ b/gm-server/app/router.ts @@ -8,6 +8,7 @@ export default (app: Application) => { router.post('/api/login/account', controller.login.login); router.post('/api/login/changeMyPass', tokenParser, controller.login.changeMyPass); router.post('/api/currentUser', tokenParser, controller.login.currentUser); + router.get('/api/login/channel', controller.login.channelLogin); router.post('/api/upload/hotupdate', tokenParser, controller.upload.upload); router.post('/api/upload/uploadjson', tokenParser, controller.upload.uploadJson); router.post('/api/upload/reloadresource', tokenParser, controller.upload.reloadResource); diff --git a/gm-server/app/service/GmUser.ts b/gm-server/app/service/GmUser.ts index 251a12b20..96c2eccec 100644 --- a/gm-server/app/service/GmUser.ts +++ b/gm-server/app/service/GmUser.ts @@ -1,8 +1,11 @@ import { GMUserModel } from '@db/GMUser'; import { GMGroupModel } from '@db/GMGroup'; import { Service } from 'egg'; -import { STATUS } from '@consts'; +import { BACKEND_37_CODE, SDK_37_CONST, STATUS } from '@consts'; import { gameData } from '@pubUtils/data'; +import { nowSeconds } from '@pubUtils/timeUtil'; +import { isNumber } from 'util'; +import { get37BackendMd5Sign } from '@pubUtils/sdkUtil'; /** * Test Service @@ -26,6 +29,9 @@ export default class GMUsers extends Service { if(!user.isEnable) { return ctx.service.utils.resResult(STATUS.GM_NO_AUTHORITY_GET); } + if(user.type != 1) { + return ctx.service.utils.resResult(STATUS.GM_USER_TYPE_ERR); + } let group = new Array(); if(user.groupId != undefined) { let g = await GMGroupModel.getGroupById(user.groupId); @@ -53,6 +59,39 @@ export default class GMUsers extends Service { return ctx.service.utils.resResult(STATUS.SUCCESS, { user: ctx.user, group }); } + public async channelLogin(uname: string, _time: string, sign: string) { + const {ctx} = this; + let time = parseInt(_time); + if(!uname || !time || !isNumber(time) || !sign) { + return ctx.service.utils.resResult(BACKEND_37_CODE.WRONG_PARAM); + } + + if(nowSeconds() - time > 15 * 60) { + return ctx.service.utils.resResult(BACKEND_37_CODE.TIME_IS_EXPIRED); + } + + let checkResult = this.check37Sign({ uname, time, sign }); + if(!checkResult) { + return ctx.service.utils.resResult(BACKEND_37_CODE.MD5_ERR); + } + let token = ctx.service.utils.genCode(256); + let user = await GMUserModel.channelLogin(uname, token); + if(!user) { + return ctx.service.utils.resResult(BACKEND_37_CODE.USER_NOT_FOUND); + } + if(user.type != 2) { + return ctx.service.utils.resResult(BACKEND_37_CODE.LOGIN_FAIL); + } + return ctx.service.utils.resResult(BACKEND_37_CODE.SUCCESS, { token: user.token }); + } + + private check37Sign(params: { uname: string, time: number, sign: string }) { + let sign = get37BackendMd5Sign(params, SDK_37_CONST.BACKEND_KEY); + console.log('******37Sign', sign, params.sign, sign == params.sign); + return sign == params.sign; + } + + /** * 修改我的密码 */ @@ -196,8 +235,8 @@ export default class GMUsers extends Service { /** * 用户组添加接口 */ - public async saveGmGroupToUser(uid: number, groupId: number, envs: string[], isEnable: boolean) { - await GMUserModel.updateInfo(uid, { groupId, envs, isEnable }); + public async saveGmGroupToUser(uid: number, groupId: number, envs: string[], isEnable: boolean, type: number) { + await GMUserModel.updateInfo(uid, { groupId, envs, isEnable, type }); return this.ctx.service.utils.resResult(STATUS.SUCCESS); } diff --git a/shared/consts/constModules/httpConst.ts b/shared/consts/constModules/httpConst.ts index 10e55e1d9..baecd5838 100644 --- a/shared/consts/constModules/httpConst.ts +++ b/shared/consts/constModules/httpConst.ts @@ -28,6 +28,7 @@ export enum SDK_37_CONST { PAY_KEY = '0;_Zy.qodXCF8NGQmrOYltk%HgfAz*39', // 重置KEY CHAT_KEY = '3PerD)H!JdTC_pEUnZl8vXKgasj5;7Q~', // 聊天KEY IOS_PID = 'zyz', + BACKEND_KEY = 'zyzbackend2022', } export enum SDK_TA_CONST { diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index eef12c399..1076f9e0e 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -550,6 +550,7 @@ export const STATUS = { GM_OLD_REF_TIME_ERR: { code: 60029, simStr: '正在进行中的时间不可更新成未来' }, GM_HIDDEN_CANNOT_INIT: { code: 60030, simStr: '已初始化过' }, GM_ACTIVITY_TIME_ERR: { code: 60031, simStr: '时间不可有重叠' }, + GM_USER_TYPE_ERR: { code: 60032, simStr: '您不可使用账号密码登录,请从专属后台点击链接进入' }, // 支付相关状态 70000 - 79999 NO_PRODUCT_ID: { code: 70001, simStr: '无效商品' }, NO_PAY_TYPE: { code: 70002, simStr: '无效支付类型' }, @@ -616,4 +617,13 @@ export const SDK_37_REFUND_CODE = { IP_LIMIT: { code: -3, simStr: 'IP限制' }, MD5_ERR: { code: -4, simStr: 'md5校验错误' }, TIME_IS_EXPIRED: { code: -6, simStr: 'time时间已过期' }, +} + +export const BACKEND_37_CODE = { + SUCCESS: { code: 1, simStr: '成功' }, + WRONG_PARAM: { code: -1, simStr: '参数不全' }, + MD5_ERR: { code: -2, simStr: '加密签名错误' }, + TIME_IS_EXPIRED: { code: -3, simStr: '请求超时(连接已过期)' }, + USER_NOT_FOUND: { code: -4, simStr: '非法账号' }, + LOGIN_FAIL: { code: -5, simStr: '登录失败' }, } \ No newline at end of file diff --git a/shared/db/GMUser.ts b/shared/db/GMUser.ts index a0ffc39d9..774419fb6 100644 --- a/shared/db/GMUser.ts +++ b/shared/db/GMUser.ts @@ -2,6 +2,7 @@ import { COUNTER } from './../consts'; import { CounterAllModal } from './CounterAll'; import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType, mongoose, ReturnModelType } from '@typegoose/typegoose'; +import { nowSeconds } from '@pubUtils/timeUtil'; const bcrypt = require('bcrypt'); const SALT_WORK_FACTOR = 5 @@ -39,6 +40,12 @@ export default class GMUser extends BaseModel { @prop({ required: true }) token: string; + @prop({ required: true }) + expireTime: number; + + @prop({ required: true }) + type: number; // 1-37账号登录 2-我方账号登录 + public static async updateInfo(uid: number, params: GMUserUpdate) { let user = await GMUserModel.findOneAndUpdate({ uid }, params, { new: true }).lean(); return user; @@ -53,13 +60,13 @@ export default class GMUser extends BaseModel { } public static async getGmAccountList(lean = true) { - const user: GMUserType[] = await GMUserModel.find().select('uid username name token envs groupId isEnable').lean(lean); + const user: GMUserType[] = await GMUserModel.find().select('uid username name token envs groupId isEnable type').lean(lean); return user; } public static async getGmAccountByToken(token: string, lean = true) { // console.log(token) - const user: GMUserType = await GMUserModel.findOne({ token }).select('uid username name token envs groupId isEnable').lean(lean); + const user: GMUserType = await GMUserModel.findOne({ token }).select('uid username name token envs groupId isEnable expireTime').lean(lean); return user; } @@ -78,13 +85,18 @@ export default class GMUser extends BaseModel { if (user) { let { salt } = user; let { npassword } = await this.encryptPass(password, salt); - const checkUser: GMUserType = await GMUserModel.findOneAndUpdate({ username, password: npassword }, { token }).select('uid username name token envs groupId isEnable').lean(lean); + const checkUser: GMUserType = await GMUserModel.findOneAndUpdate({ username, password: npassword }, { $set: { token, expireTime: nowSeconds() + 24 * 60 * 60 } }).select('uid username name token envs groupId isEnable type').lean(lean); return checkUser; } else { return null } } + public static async channelLogin(username: string, token: string) { + const user: GMUserType = await GMUserModel.findOneAndUpdate({ username }, { $set: { token, expireTime: nowSeconds() + 1 * 60 * 60 } }, {new: true}).select('token type').lean(); + return user; + } + public static async createGmAccount(username: string, password: string, name: string, token: string, lean = true) { const uid = await CounterAllModal.getNewCounter(COUNTER.GMUID); let r = await this.encryptPass(password); diff --git a/shared/pubUtils/sdkUtil.ts b/shared/pubUtils/sdkUtil.ts index ee30d0788..6ba3f51b5 100644 --- a/shared/pubUtils/sdkUtil.ts +++ b/shared/pubUtils/sdkUtil.ts @@ -69,6 +69,14 @@ export function get37GetServerMd5Sign(body: GetServerListParam, key: string) { return sign } +export function get37BackendMd5Sign(body: {uname: string, time: number}, key: string) { + let { uname, time } = body; + let str = `${uname}${time}${key}`; + let sign = md5(str); + console.log('** origin str', body, str, sign); + return sign +} + export async function loginValidate37(clientId: string, pst: string, platform: string, platformAppid: string, childGameId: number = SDK_37_CONST.FX_C_GAME_ID) { if(!platformAppid) { if(platform == 'android') {