更新时间:2022-07-29 GMT+08:00
签名生成方法
Jwt测试工具:https://jwt.io/
Java代码参考样例:
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.Base64;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class TokenSignature {
private static String ACCESS_KEY = "*********************************WmXW2UKSU0=";
/***
* 生成入会token
*
* @param accessKey accessKey
* @param paramsMap paramsMap
* @return token
*/
public static String getToken(String accessKey, Map<String, ?> paramsMap) throws Exception {
String signature = generateResponseBodySignature(accessKey, paramsMap);
String bodyStr = getBody(paramsMap);
String token = bodyStr + "@#@" + signature;
return Base64.getEncoder().encodeToString(token.getBytes());
}
private static String getBody(Map<String, ?> paramsMap) {
String result = "{\"timeStamp\":" + paramsMap.get("timeStamp") + ",\"role\":\"" + paramsMap.get("role")
+ "\",\"port\":\"" + paramsMap.get("port") + "\",\"appId\":\"" + paramsMap.get("appId")
+ "\",\"host\":\"" + paramsMap.get("host") + "\",\"tenantId\":\"" + paramsMap.get("tenantId")
+ "\",\"userId\":\"" + paramsMap.get("userId") + "\",\"channelId\":\"" + paramsMap.get("channelId")
+ "\"}";
return result;
}
/**
* 参数验签
*
* @param accessKey accessKey
* @param paramsMap paramsMap
* @return String
* @throws NoSuchAlgorithmException NoSuchAlgorithmException
* @throws InvalidKeyException InvalidKeyException
*/
public static String generateResponseBodySignature(String accessKey, Map<String, ?> paramsMap)
throws NoSuchAlgorithmException, InvalidKeyException {
Map<String, Object> sortedMap = new TreeMap<>(paramsMap);
sortedMap.remove("authToken");
String timeStamp = getMapValue(paramsMap, "timeStamp");
StringBuilder strBuffer = new StringBuilder();
Set<String> keySet = sortedMap.keySet();
for (String key : keySet) {
String value = getMapValue(sortedMap, key);
strBuffer.append("&").append(key).append("=").append(value);
}
// 修正消息体,去除第一个参数前面的&
String reqParams = strBuffer.toString().substring(1);
String key = accessKey + timeStamp;
return generateResponseBodySignature(key, reqParams);
}
private static String generateResponseBodySignature(String key, String body)
throws InvalidKeyException, NoSuchAlgorithmException, IllegalStateException {
return Base64.getEncoder().encodeToString(hmacSHA256(key, body));
}
private static byte[] hmacSHA256(String macKey, String macData)
throws NoSuchAlgorithmException, InvalidKeyException, IllegalStateException {
SecretKeySpec secret = new SecretKeySpec(macKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(secret);
return mac.doFinal(macData.getBytes(StandardCharsets.UTF_8));
}
private static String getMapValue(Map<String, ?> paramsMap, String key) {
Object value = paramsMap.get(key);
if (value instanceof List) {
if (((List) value).size() > 0) {
return ((List) value).get(0).toString();
}
}
return value != null ? value.toString() : null;
}
public static void main(String[] args) throws Exception {
String userId = "12123123123123";
String channelId = "222507302531141";
String host = "11.22.33.44";
String port = "443";
String role = "1";
String tenantId = "2012";
String appId = "****************iEjCfpGtMzlZPM0T";
Long timeStamp = System.currentTimeMillis();
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("userId", userId);
paramsMap.put("channelId", channelId);
paramsMap.put("host", host);
paramsMap.put("port", port);
paramsMap.put("role", role);
paramsMap.put("tenantId", tenantId);
paramsMap.put("appId", appId);
paramsMap.put("timeStamp", timeStamp);
String token = getToken(ACCESS_KEY, paramsMap);
System.out.println("token:\n" + token);
}
}
父主题: 接入鉴权