feat(后台): 37sdk需求

This commit is contained in:
luying
2022-11-25 17:18:38 +08:00
parent 594a8ce96d
commit 76633e67a6
9 changed files with 99 additions and 9 deletions

View File

@@ -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);
}
}

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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 {

View File

@@ -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: '登录失败' },
}

View File

@@ -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);

View File

@@ -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') {