说明
语音服务在回调前会对回调数据进行签名操作,如果用户已通过其他方式完成鉴权,可忽略以下内容
语音服务在 服务开通时,会为每个用户生成 AuthToken( 随机10位字符串 )。
用户可在基础设置页编辑 Token ,支持输入10~20位字符串。
火山通信将在回调url时添加两个请求参数,分别为 timestamp 和 authCode 。
字段 | 说明 |
---|---|
timestamp | unix时间戳(单位:秒),消息回执时间戳 |
authCode | 验证签名,根据AuthCode计算公式得出 |
AuthCode = SHA256(timestamp + SHA256(requestBody).toHexString() + authToken).toHexString()
假设某次回调地址为
http://example.com/path?timestamp=1622539884&authCode=8090de7b7bab3d9e626280f635a60a8453d2ba75403f13aac3f4d5dccf6c2264
用户收到请求后,查询配置在语音服务侧的token为
8D202AC288
同时收到本次请求的body为
{"callId":"abcdefg","accountId":"123456789"}
获取url中的timestamp参数为
1622539884
根据公式计算AuthCode,为
8090de7b7bab3d9e626280f635a60a8453d2ba75403f13aac3f4d5dccf6c2264
与url中的参数一致,验签通过
/** * AuthCode工具 */public class AuthCodeUtils { public static String calAuthCode(String authToken, String timestamp, byte[] body) throws NoSuchAlgorithmException { MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); // SHA256(responseBody).toHexString() String middleStr = Hex.encodeHexString(messageDigest.digest(body)); // SHA256(timestamp + SHA256(responseBody).toHexString() + authToken).toHexString() String originStr = timestamp + middleStr + authToken; return Hex.encodeHexString(messageDigest.digest(originStr.getBytes(Charset.forName("UTF-8")))); } }