|
|
const serviceApi = global.yoho.ServiceAPI;
|
|
|
const ufoAPI = global.yoho.UfoAPI;
|
|
|
const logger = global.yoho.logger;
|
|
|
const _ = require('lodash');
|
|
|
const md5 = require('yoho-md5');
|
|
|
const checkParams = require('../../utils/check-params');
|
|
|
const handleResult = require('../../utils/handle-result');
|
|
|
const apiMaps = require('../../config/api-map');
|
|
|
|
|
|
function checkSign(params, sign) {
|
|
|
delete params.s;
|
|
|
const sortKeys = Object.keys(params).sort();
|
|
|
const str = sortKeys.map(key => {
|
|
|
return `${key}:${encodeURIComponent(params[key])}`;
|
|
|
}).join('_');
|
|
|
|
|
|
const signDiff = md5(`${str}_${str.length}`);
|
|
|
|
|
|
if (sign === signDiff) {
|
|
|
return true;
|
|
|
}
|
|
|
logger.error(`验签不匹配: 提交sign: ${sign}, 服务端sign: ${signDiff}, params: ${JSON.stringify(params)}`);
|
|
|
return false;
|
|
|
}
|
|
|
const errorHandler = require('./error-handler');
|
|
|
|
|
|
module.exports = async(req, res, next) => {
|
|
|
const apiInfo = apiMaps[req.path];
|
|
|
|
|
|
if (!apiInfo) {
|
|
|
return next();
|
|
|
}
|
|
|
let baseParams;
|
|
|
let reqParams = Object.assign({}, req.query, req.body);
|
|
|
|
|
|
req.route = {
|
|
|
path: req.path
|
|
|
};
|
|
|
|
|
|
res.set({
|
|
|
'Cache-Control': 'no-cache',
|
|
|
Pragma: 'no-cache',
|
|
|
Expires: (new Date(1900, 0, 1, 0, 0, 0, 0)).toUTCString()
|
|
|
});
|
|
|
const apiInfo = apiMaps[req.path];
|
|
|
|
|
|
if (apiInfo.checkSign) {
|
|
|
if (!checkSign(Object.assign({}, reqParams), reqParams.s)) {
|
|
|
logger.error(`验签失败!uid: ${_.get(req, 'user.uid', '').toString()}, params: ${JSON.stringify(reqParams)}, ip: ${req.yoho.clientIp}`);
|
|
|
return res.json({
|
|
|
code: 400,
|
|
|
message: '验签失败'
|
|
|
});
|
|
|
}
|
|
|
if (!apiInfo) {
|
|
|
return next();
|
|
|
}
|
|
|
const baseParams = {};
|
|
|
|
|
|
delete reqParams.s;
|
|
|
delete reqParams.ts;
|
|
|
req.route = {
|
|
|
path: req.path
|
|
|
};
|
|
|
|
|
|
if (!apiInfo.service) {
|
|
|
baseParams = {
|
|
|
uid: (req.user && req.user.uid) ? {
|
|
|
baseParams.method = apiInfo.api;
|
|
|
}
|
|
|
if (apiInfo.auth) {
|
|
|
if (req.user && req.user.uid) {
|
|
|
baseParams.uid = {
|
|
|
toString: () => {
|
|
|
return req.user.uid || 0;
|
|
|
return req.user.uid;
|
|
|
},
|
|
|
sessionKey: req.user.sessionKey,
|
|
|
appSessionType: req.user.appSessionType
|
|
|
} : 1,
|
|
|
method: apiInfo.api
|
|
|
};
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
const mergeParams = Object.assign(reqParams, baseParams);
|
|
|
const params = checkParams.getParams(mergeParams, apiInfo);
|
|
|
const cache = req.method.toLowerCase() !== 'get' ? false : apiInfo.cache;
|
|
|
const reqParams = Object.assign({}, req.query, req.body, baseParams);
|
|
|
const params = checkParams.getParams(reqParams, apiInfo, req);
|
|
|
const cache = (req.method.toLowerCase() !== 'get' || apiInfo.auth) ? false : apiInfo.cache;
|
|
|
|
|
|
let method = req.method.toLowerCase() === 'post' ? 'post' : 'get';
|
|
|
|
|
|
let result;
|
...
|
...
|
@@ -80,7 +51,7 @@ module.exports = async(req, res, next) => { |
|
|
if (apiInfo.service) {
|
|
|
result = await apiCtx.get({
|
|
|
api: serviceApi,
|
|
|
url: apiInfo.api,
|
|
|
url: `${apiInfo.api || ''}${apiInfo.path || ''}`,
|
|
|
data: params,
|
|
|
param: {
|
|
|
cache: cache,
|
...
|
...
|
@@ -105,16 +76,12 @@ module.exports = async(req, res, next) => { |
|
|
});
|
|
|
}
|
|
|
if (result) {
|
|
|
return res.json(result);
|
|
|
return res.json(handleResult(result, apiInfo));
|
|
|
}
|
|
|
return res.json({
|
|
|
code: 400
|
|
|
});
|
|
|
} catch (error) {
|
|
|
logger.error(error);
|
|
|
return res.json({
|
|
|
code: error.code || 500,
|
|
|
message: error.message || '服务器错误'
|
|
|
});
|
|
|
return errorHandler.serverError(error, req, res, next);
|
|
|
}
|
|
|
}; |
...
|
...
|
|