我们只支持HTTPS endpoint
由于Moka需要发送一些候选人信息到外部,其中可能包含敏感信息,我们要确保所有信息都是加密过的。虽然要求是HTTPS的endpoint,但是我们并不会去向CA验证证书的有效性,所以你可以提供self-signed证书。关于如何创建并使用self-signed证书。
签名验证
```javascript import crypto from 'crypto';
/** * @description body签名 * @description 加密方式 HamcSha256 * @description 加密结果为16进制 * @param {Object} body 接口参数 * @param {String} signKey 加密使用的key */ function validateWebhook(body, signKey) { const signStr = JSON.stringify(body); console.log('sha256 signStr:', signStr);// sha256 signStr: {"name":"test","email":"test@mokahr.com"} const sign = crypto.createHmac('sha256', signKey).update(signStr).digest('hex');
console.log('sha256 sign:', sign);// sha256 sign: 7d6981ccf0d789e29e4f5940fe9a7e9385d8a211ad44ecaaba335fb14dd2a32d } const body = { name: 'test', email: 'test@mokahr.com', } const signKey = 'qwer';
validateWebhook(body, signKey); ```
我们通过对请求body签名的方式来确保请求来源的真实性(authentication,即请求来源于Moka)。签名生成的signature会被放置于请求url的query中随着请求内
容一起发送。请求URL如:
https://your-endpoint.com/moka?sign=d23da96c279366d66e2780d300d9b09d6b0ec09efbbe2c3fd84980d981e4b41a
验证方面,需要你用signing key作为密钥、请求body作为内容,通过HMAC-SHA256
来计算得出结果,并与请求URL中的signature进行比较。
数据加密
如果您对数据的安全性要求更高,可以选择对传输的数据进行加密。我们的加密算法采用AES-256,16进制,加密模式为CBC。 我们只会对body中的data
字段进行加密,不包括id
,event
,triggeredAt
等字段。 如果需要数据加密,请联系与您企业对接的客户成功经理进行开通,并设置加密密钥。 加密密钥请妥善保存,如泄漏请及时联系我们进行处理。
签名验证
数据加密解密
import crypto from 'crypto';
/** * 数据加密 * @param {Object} data 需要加密的数据 * @param {String} signKey 加密的key值 * @param {String} signIv 初始化向量 * * @return {String} enciphered result */
function dataEncrypt(data, signKey, signIv) {
const signStr = JSON.stringify(data);
const cipher = crypto.createCipheriv('aes-256-cbc', signKey, signIv);
let result = cipher.update(signStr, 'utf8', 'hex');
result += cipher.final('hex');
return result;
}
/** * 数据解密 * @param {String} signStr 需要解密的数据 * @param {String} signKey 解密的key值 * @param {String} signIv 初始化向量 * * @return {String} deciphered result */
function dataDecrypt(signStr, signKey, signIv) {
const cipher = crypto.createDecipheriv('aes-256-cbc', signKey, signIv);
let result = cipher.update(signStr, 'utf8', 'hex');
result += cipher.final('hex');
return result;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16