第三方调用免密登录方案
url: /xxx?userId=xxx&signature=xxx×tamp=xxx
请求方法:get
请求参数:

备注:签名字符串为siginStr = `tenantCode=${租户code}&userId=${用户id}` ,签名与上面一致
带上signature签名和timestamp生成方法
Content-Type: application/json
timestamp,请求的时间戳,精确到毫秒如1609750982947
signature生成方法,其中默认token:1ccb67d38d06f05d9481ba9213497684
1 /**
2 * 获取签名⽅法,主要通过如下3步⽣成
3 * 1.将签名时⽤到的参数字符串,重新按照再把英⽂等号连接得到的字符串按参数名称
的字典顺序依次使⽤&符号连接,即得到规范化请求字符串
4 * 2.将将第⼀步⽣成的字参串newParam,前后加上签名token,中间由“:”进⾏分隔⽣成
新的字符串如${token}:${newParam}:${token}
5 * 3.采⽤MD5信息摘要算法,⽣成签名
6 * @param {string} param ⽤于⽣成签名的字符串
7 * @param {string} token 签名时使⽤的token
8 */
9 //js实现
10 getSignature(param = '', token) {
11 let paramString = `${token}:${param.trim().split('&').sort().
join('&')}:${token}`;
12 return crypto.createHash('md5').update(Buffer.from(paramStrin
g, 'utf8')).digest('hex');
13 }
14 //java实现
15 public static String getSignature(Map<String,Object> params){
16 List<String> paramsList = new ArrayList<>();
17 params.forEach((key,value) -> {
18 paramsList.add(String.join("=", key, String.valueOf(value
)));
19 });
20 // 字典序
21 Collections.sortnew Comparator<String>() {
22 @Override
23 public int compare(String o1, String o2) {
24 Comparator<Object> com = Collator.getInstance(java.ut
il.Locale.CHINA);
25 return com.compare(o1, o2);
26 }
27 });
28 // joinToken
29 String paramsListStr = String.join("&",paramsList);
30 String paramsListStrToekn = String.format("%s:%s:%s",USERCEN
TER_TOKEN,paramsListStr, USERCENTER_TOKEN);
31 // md5
32 return DigestUtils.md5DigestAsHex(paramsListStrToekn.getBytes
());
33 }
生成实例如下:
"username=brain1&status=[0]"
再调用法getSignature如下:
getSignature('username=brain1&status=[0]','1ccb67d38d06f05d9481ba9213497684')
输出值:21111de813c42482a726b8247de3d541
确保输出⼀致,则签名方法正确