第三方调用免密登录方案

url: /xxx?userId=xxx&signature=xxx&timestamp=xxx

请求方法:get

请求参数:

3

备注:签名字符串为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

确保输出⼀致,则签名方法正确

阿里云首页 工业大脑开放平台 相关技术圈