UNPKG

yf-fpm-server

Version:

yf fast-platform api server

116 lines (92 loc) 2.71 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _lodash = require('lodash'); var _lodash2 = _interopRequireDefault(_lodash); var _exception = require('../utils/exception.js'); var _kit = require('../utils/kit'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const ARG_ARRAY = 'method,appkey,timestamp,sign'.split(','); let compare = ctx => { let postData = ctx.request.body; let dev = ctx.fpm.getConfig('dev') || 'DEV'; let apps = ctx.fpm.getClients(); let checkResult = checkArgs(postData, dev, apps); if (checkResult.errno !== true) { return checkResult; } let method = postData.method; let appkey = postData.appkey; let v = postData.v || ctx.fpm.getConfig('defaultVersion'); let timestamp = postData.timestamp; timestamp = parseInt(timestamp); if ('DEV' != dev) { let delta = _lodash2.default.now() - timestamp; if (Math.abs(delta / 100 / 60) > 30) { return _exception.E.System.TIMEZONE_OVER; } } let param = postData.param; if (_lodash2.default.isString(param)) { try { param = JSON.parse(param); } catch (e) { return _exception.E.System.PARAM_IS_NOT_JSON; } } return true; }; let checkArgs = (args, dev, apps) => { if (!args) { return _exception.E.System.NO_POST_DATA; } for (let i in ARG_ARRAY) { let a = ARG_ARRAY[i]; if (!_lodash2.default.has(args, a)) { return _exception.E.System.LOST_PARAM(a); } } if ('DEV' === dev) { return true; } if (sign(args, apps)) { return true; } return _exception.E.System.SIGN_ERROR; }; let sign = (args, apps) => { let sign = args.sign; delete args.sign; if (apps) { args.masterKey = apps[args.appkey].secretkey; } else { args.masterKey = '123'; } let ks = _lodash2.default.keys(args); ks = ks.sort(); let strArgs = _lodash2.default.map(ks, k => { let val = args[k]; if (_lodash2.default.isObject(val)) { val = JSON.stringify(val); } return k + '=' + encodeURIComponent(val); }); let content = strArgs.join('&'); let d = (0, _kit.md5)(content); return d == sign; }; exports.default = async (ctx, next) => { let req = ctx.request; let path = req.url; if (path === '/api') { let judgeResult = compare(ctx); if (judgeResult === true) { await next(); } else { ctx.fail(judgeResult); } } else { await next(); } };