获取令牌接口

本节主要给出获取令牌接口的请求参数和返回参数,并对请求参数中secret的计算逻辑进行说明。

基本信息

  • 功能说明:租户通过签名验证接入AK,获取访问令牌

  • Content-Type:application/json;charset=UTF-8

  • Http Method:POST

  • Request Path:/api/contract/shakeHand

请求参数

参数名

必选

类型

说明

accessId

string

租户AK ID

time

string

签名时戳,毫秒单位的时间值

secret

string

签名数据,16进制编码字符串,签名内容是accessId+time,具体说明参见下方secret计算逻辑

返回参数

参数名

类型

说明

success

boolean

是否成功

code

string

错误码

data

string

- 成功:访问令牌

- 失败:提示信息

secret计算逻辑

完整流程

  1. 拼接签名内容。

    accessId当前时间戳拼接成字符串,作为签名内容。示例如下:

    accessId = "8cf380ba"
    当前时间戳 = "1755684845287"
    签名内容 = "8cf380ba1755684845287"
  2. 加载私钥(RSA算法的)。

    从文件中加载并解码私钥,然后生成私钥对象。示例如下:

    byte[] bytesPrivateBase64 = ...; // 私钥文件的内容(去掉文件中的注释行,例如:`-----BEGIN RSA PRIVATE KEY-----` 和 `-----END RSA PRIVATE KEY-----`,只保留中间的密钥内容)
    byte[] bytesPrivate = Base64.decode(bytesPrivateBase64);
    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytesPrivate);
    KeyFactory keyFactory = null;
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
  3. 生成签名。

    使用SHA256withRSA算法对签名内容进行签名。示例如下:

    Signature signature = Signature.getInstance("Sha256WithRSA");
    signature.initSign(privateKey);
    signature.update(plain.getBytes("UTF-8"));
    byte[] signed = signature.sign();
  4. 转换签名。

    将签名结果转换为十六进制字符串,最终生成的secret参数即为请求的签名值。示例如下:

    String secret = new String(Hex.encode(signed));

完整示例代码

// 1. 拼接签名内容
String plain = accessId + currentTimestamp; // 例如:"8cf380ba1755684845287"

// 2. 加载私钥
byte[] bytesPrivateBase64 = ...; // 私钥文件内容
byte[] bytesPrivate = Base64.decode(bytesPrivateBase64);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytesPrivate);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);

// 3. 初始化签名器
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(plain.getBytes("UTF-8"));

// 4. 生成签名
byte[] signed = signature.sign();

// 5. 转换为十六进制字符串
String secret = new String(Hex.encode(signed));

注意事项

类别

注意事项

时间戳

确保时间戳与服务器时间同步,避免因时间偏差导致签名验证失败。

私钥文件

私钥文件必须安全存储,避免泄露。

编码

确保签名内容的编码格式(如 UTF-8)与签名生成时一致。

签名算法

使用SHA256withRSA确保签名的安全性和不可篡改性。