You need to enable JavaScript to run this app.
导航

消息回执鉴权

最近更新时间2023.03.14 15:18:06

首次发布时间2023.02.28 20:31:39

说明

语音服务在回调前会对回调数据进行签名操作,如果用户已通过其他方式完成鉴权,可忽略以下内容

1. 前提

语音服务在 服务开通时,会为每个用户生成 AuthToken( 随机10位字符串 )。
用户可在基础设置页编辑 Token ,支持输入10~20位字符串

2. 描述

火山通信将在回调url时添加两个请求参数,分别为 timestampauthCode

字段说明
timestampunix时间戳(单位:秒),消息回执时间戳
authCode验证签名,根据AuthCode计算公式得出

AuthCode 计算公式

AuthCode = SHA256(timestamp + SHA256(requestBody).toHexString() + authToken).toHexString()
3. 用户侧验签流程

假设某次回调地址为

http://example.com/path?timestamp=1622539884&authCode=8090de7b7bab3d9e626280f635a60a8453d2ba75403f13aac3f4d5dccf6c2264

用户收到请求后,查询配置在语音服务侧的token为

8D202AC288

同时收到本次请求的body为

{"callId":"abcdefg","accountId":"123456789"}

获取url中的timestamp参数为

1622539884

根据公式计算AuthCode,为

8090de7b7bab3d9e626280f635a60a8453d2ba75403f13aac3f4d5dccf6c2264

与url中的参数一致,验签通过

4. AuthCode计算样例(Java)
/**

 * 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"))));
    }
}