生成签名的通用步骤
第一步:设所有发送或者接收到的数据为集合M,将集合 M 内非空参数值的参数按照参数名 ASCII 码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串 stringA 特别注意以下重要规则:- 参数名 ASCII 码从小到大排序(字典序)
- 如果参数的值为空不参与签名
- 参数名区分大小写
- 传送的 sign 参数不参与签名,将生成的签名与该 sign 值作校验
- 传送的值为:空、undefined、null的,不参与签名 2021/11/19
第三步:所有API的入参均需要包含 sign 参数,值为第二步加密得到的 signValue
第四步:将获取到的 token 字符前面拼接 Bearer 字符,Bearer 与 token 中间用空格分隔,将拼接后的字符写入 Request Headers 中的 Authorization 属性
第五步:所有入参均需要包含时间戳,参数名:timestamp,值为秒值,长度10位,时间戳有效期:±10分钟
关于 POST、PUT 参数的签名验证注意事项
涉及 POST、PUT 参数发送时,需要注意 'Content-Type' 。目前 'application/x-www-form-urlencoded' 类型的数据发送是无法进行正确的签名验证的。原因是目前服务器端解析 POST 参数时,无法保证参数顺序与发送时完全一样,于是客户端和服务器端拿到的包含 POST 数据的 request.body 内容就不一样,于是各自产生的签名结果也不一样。 顺利进行 POST 参数的签名有以下几个要点:- 所有的 POST、PUT 参数需要将包含所有参数键、值的参数字典封装成一个 JSON 格式字符串,再作为 POST 的具体内容发送,这样利用 JSON 的封装保证客户端和服务器端对 POST 参数的传输、解析顺序是完全一致的。
- 在 HTTP HEADER 里头,标记 'Content-Type':'application/json' 。这样服务器端才知道客户端发送过来的 POST 数据是 JSON 格式。
- JSON 中所有的字符串数据,应该使用 utf-8 编码!
{ medicalhistory: [ '高血压', '心脏病' ], name: '张三', gender: '男', relation: '本人', weight: 70, height: 175, address: '北京市' }这些 POST 参数变成 JSON 后,会是:
{"medicalhistory":["高血压","心脏病"],"name":"张三","gender":"男","relation":"本人","weight":70,"height":175,"address":"北京市"}于是,使用上述 JSON 字符串作为键值对参数参与签名,键值对 key 名称为:post_params,非 POST、PUT 的请求或 request.body 无内容时不需要此参数参与签名
补充:
如果涉及文件上传,仍然可以使用 application/x-www-form-urlencoded 方式,因为文件的具体数据部分,在服务器端识别时,不会作为被签名内容的组成部分。
任何请求,如果 request.body 为:空 或 {} 或 [] 不参与签名,其他情况都需要参与签名
- Since:
- 2021/11/19
Examples
假设传送的参数如下:
键值对参数:
patientsId=5e1bff31ef89e1059c0c98b9
timestamp=1570428513
JSON参数:
{
"medicalhistory":["高血压","心脏病"],
"name":"李四",
"gender":"女",
"birthday":"1976-11-13T16:00:00.000Z",
"relation":"夫妻",
"weight":60,
"height":165,
"address":"北京市",
"other":"无"
}
参数拼接成字符串(按照参数名 ASCII 码从小到大排序后) [stringA]:
patientsId=5e1bff31ef89e1059c0c98b9&post_params={"medicalhistory":["高血压","心脏病"],
"name":"李四","gender":"女","birthday":"1976-11-13T16:00:00.000Z","relation":"夫妻","w
eight":60,"height":165,"address":"北京市","other":"无"}×tamp=1570428513
获取的 token:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXJ0bmVySWQiOiI
1ZGI5OWM1NWJmZmQ0OTRjZTAyMjlmNTkiLCJpYXQiOjE1Nzg5Nzk1NTk
sImV4cCI6MTU3ODk4Njc1OX0.PUiOOLnWQYvsg1ZQgHbFC8249SYMJTU
3C-fb3AgnrWk
拼接 token 后的字符串 [stringSignTemp]:
patientsId=5e1bff31ef89e1059c0c98b9&post_params={"medicalhistory":["高血压","心脏病"],
"name":"李四","gender":"女","birthday":"1976-11-13T16:00:00.000Z","relation":"夫妻","w
eight":60,"height":165,"address":"北京市","other":"无"}×tamp=1570428513&eyJhbGciO
iJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXJ0bmVySWQiOiI1ZGI5OWM1NWJmZmQ0OTRjZTAyMjlmNTkiLCJpY
XQiOjE1Nzg5Nzk1NTksImV4cCI6MTU3ODk4Njc1OX0.PUiOOLnWQYvsg1ZQgHbFC8249SYMJTU3C-fb3AgnrWk
SHA256 加密后的签名字符串(转大写后) [signValue]:
344A13861D5ABF8AE438D3529D910FA27CB94595B2717ABC007C3E064D22CC72
最终接口传参:
URL参数:
patientsId=5e1bff31ef89e1059c0c98b9&sign=344A13861D5ABF8AE438D3529D910FA27CB94595B2717ABC007C3E064D22CC72×tamp=1570428513
JSON参数:
{
"medicalhistory":["高血压","心脏病"],
"name":"李四",
"gender":"女",
"birthday":"1976-11-13T16:00:00.000Z",
"relation":"夫妻",
"weight":60,
"height":165,
"address":"北京市",
"other":"无"
}
Request.Headers.Authorization:
Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXJ0bmV
ySWQiOiI1ZGI5OWM1NWJmZmQ0OTRjZTAyMjlmNTkiLCJpYXQiOjE1Nz
g5Nzk1NTksImV4cCI6MTU3ODk4Njc1OX0.PUiOOLnWQYvsg1ZQgHbFC
8249SYMJTU3C-fb3AgnrWk