认证参数token生成说明
2024.07.09 11:03:55
认证参数token生成说明
接口使用签名方式进行认证,每一次请求都必须包含签名信息(即参数token),以验证用户身份,防止信息被恶意篡改。具体使用步骤如下。
申请安全凭证
使用 API 之前,从【易盾官网-服务管理-已开通业务】页面获取appId和appkey。请妥善保管,避免泄漏。
生成签名参数token
-
步骤一:将公共参数,按照参数名ASCII码表升序顺序排序。如参数:foo=1, bar=2,foo_bar=3, baz=4 。排序后的顺序是 bar=2, baz=4, foo=1, foobar=3。
-
步骤二:将排序好的参数名参数值对,拼装成字符串,格式为:key1value1key2value2…。根据上面示例结果为:bar2baz4foo1foobar3 。
-
步骤三:将安全凭证的appkey,加到上一步拼装的参数字符串之后。
-
步骤四:把步骤三的字符串,采用 UTF-8 编码,使用 MD5算法(128位长度)对字符串进行摘要计算,得到token参数值(32位十六进制字符串)。
代码示例
String token= SignatureUtils.genSignature(appKey, appId, timestamp, nonce);
其中:SignatureUtils.java 如下:
package com.netease.is.clientapi.utils;
import com.google.common.collect.Maps;
import org.apache.commons.codec.digest.DigestUtils;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.Map;
/**
* .
*/
public class SignatureUtils {
/**
* 暴露获取token的方法
* @param appKey
* @param appId
* @param timestamp
* @param nonce
* @return
* @throws UnsupportedEncodingException
*/
public static String genSignature(String appKey, String appId, String timestamp, String nonce) throws UnsupportedEncodingException {
Map<String, String> userParams = getTokenParams(appId, timestamp, nonce);
return SignatureUtils.genSignature(appKey, userParams);
}
/**
* 生成签名信息
* @param appKey产品私钥
* @param params 接口请求参数名和参数值map,不包括signature参数名
* @return
*/
private static String genSignature(String appKey, Map<String, String> params) throws UnsupportedEncodingException {
// 1. 参数名按照ASCII码表升序排序
String[] keys = params.keySet().toArray(new String[0]);
Arrays.sort(keys);
// 2. 按照排序拼接参数名与参数值
StringBuilder sb = new StringBuilder();
for (String key : keys) {
sb.append(key).append(params.get(key));
}
// 3. 将appKey拼接到最后
sb.append(appKey);
// 4. MD5是128位长度的摘要算法,转换为十六进制之后长度为32字符
return DigestUtils.md5Hex(sb.toString().getBytes("UTF-8"));
}
/**
* 拼接参数
* @param appId
* @param timestamp
* @param nonce
* @return
*/
private static Map<String, String> getTokenParams(String appId, String timestamp, String nonce) {
Map<String, String> userParams = Maps.newHashMap();
userParams.put("appId", appId);// 固定
userParams.put("timestamp", timestamp);
userParams.put("nonce", nonce);
return userParams;
}
}