3rd auth

获取访问密钥

通过开发者平台获取accessKeyId和accessKeySecret

此文档仅针对于调用第三方接口的鉴权

签名规则

认证请求相关参数

名称
类型
是否必选
描述

accessKeyId

String

必选

用户的访问密钥ID

accessTimestamp

String

必选

13位当前Unix时间戳,值为请求发出前15分钟内的时间戳。

requestId

String

必选

签名唯⼀随机数,⽤于防⽌⽹络重放攻击,建议每次请求使⽤不同随机数

appId

String

必选

⽤户在开发者平台注册的APP对应的appId

accessSign

String

必选

通过⽤户的AccessKey Secret计算出的签名

accessSign参数生成规则

1

步骤1:组织认证参数

  • accessKeyId

  • accessTimestamp

  • requestId

  • appId

2

步骤2:按key升序排列

key(转换为小写) 按字符代码顺序升序排列。

[('accesskeyid', '64ca6a118372e71928b5e87d'), 
 ('requestid', 'c5dcafda-b7ed-488d-afcb-7d2a2e276187'), 
 ('accesstimestamp', '1745850607140'), 
 ('appid', '12'),
 ]
3

步骤3:拼接key=value

将排序后的 key=value 通过 & 符号连接,生成待签名字符串。

accesskeyid=64ca6a118372e71928b5e87d&accesstimestamp=1745850607140&appid=12&requestid=c5dcafda-b7ed-488d-afcb-7d2a2e276187
4

步骤4:计算HmacMD5签名

使用 AccessKey Secret 对拼接后的字符串进行 HmacMD5签名,结果用16进制表示,得到 accessSign

示例结果:

02dc0f694d3a708455349735499cfbc4
  • 算法:HmacMD5

  • HmacMD5工具参考:http://www.metools.info/code/c25.html

5

步骤5:完整认证相关参数

[('accessKeyId', '64ca6a118372e71928b5e87d'),
('accessTimestamp', '1745850607140'),
('appId', '12'),
('requestId','c5dcafda-b7ed-488d-afcb-7d2a2e276187'),
('accessSign','02dc0f694d3a708455349735499cfbc4')
]

请求接口方式

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
import java.util.TreeMap;

// 生成签名的方法
public static String generateSignature(String accessKeyId, String accessTimestamp, String requestId, String appId, String accessKeySecret) throws NoSuchAlgorithmException, InvalidKeyException {
        // 步骤 1:组织认证参数
        Map<String, String> params = new TreeMap<>();
        params.put("accessKeyId", accessKeyId);
        params.put("accessTimestamp", accessTimestamp);
        params.put("requestId", requestId);
        params.put("appId", appId);

        // 步骤 2:按 key 升序排列,TreeMap 会自动按 key 排序
        StringBuilder joinedParams = new StringBuilder();
        for (Map.Entry<String, String> entry : params.entrySet()) {
        if (joinedParams.length() > 0) {
        joinedParams.append("&");
        }
        joinedParams.append(entry.getKey().toLowerCase()).append("=").append(entry.getValue());
        }

        // 步骤 3:拼接 key=value,TreeMap 已经排序好,直接拼接即可
        String dataToSign = joinedParams.toString();

        // 步骤 4:计算 HmacMD5 签名
        Mac hmac = Mac.getInstance("HmacMD5");
        SecretKeySpec secretKeySpec = new SecretKeySpec(accessKeySecret.getBytes(StandardCharsets.UTF_8), "HmacMD5");
        hmac.init(secretKeySpec);
        byte[] digest = hmac.doFinal(dataToSign.getBytes(StandardCharsets.UTF_8));

        StringBuilder sb = new StringBuilder();
        for (byte b : digest) {
        sb.append(String.format("%02x", b & 0xff));
        }
        return sb.toString();
}

Last updated