服务端签名机制

签名校验

组织参与签名计算的字符串

String stringToSign= HTTPMethod+"\n"+ Accept+"\n"+//建议显示设置 Accept HeaderAccept 为空时,部分 Http 客户端会给 Accept 设置默认值为 */*,导致签名校验失败 Content-MD5 +"\n" Content-Type+"\n"+ Date+"\n"+ Headers+ Url

HTTPMethod 为全大写,如 POST。Accept、Content-MD5、Content-Type、Date 如果为空也需要添加换行符”\n”,Headers如果为空不需要添加”\n”。PS:如果Accept、Content-MD5(python 语言开发, 非stream方式提交,设置为空)、Date 不为空,参与加密, 在header中也要设置;如果为空 ,不参与加密,header中要去掉。

Content-MD5

Content-MD5 是指 Body 的 MD5 值,只有当 Body 非 Form 表单时才计算 MD5(python 语言开发, 非stream方式提交,都不需要计算),计算方式为:

String content-MD5 =Base64.encodeBase64(MD5(bodyStream.getbytes("UTF-8")));

bodyStream 为字节数组。

Headers

Headers 是指参与 Headers 签名计算的 Header 的 Key、Value 拼接的字符串,建议对 X-Ca 开头以及自定义 Header 计算签名,注意如下参数不参与 Headers 签名计算:X-Ca-Signature、X-Ca-Signature-Headers、Accept、Content-MD5、Content-Type、Date。

Headers 组织方法:先对参与 Headers 签名计算的 Header的Key 按照字典排序后使用如下方式拼接,如果某个 Header 的 Value 为空,则使用 HeaderKey + “:” + “\n”参与签名,需要保留 Key 和英文冒号。

String headers = HeaderKey1+":"+HeaderValue1+"\n"\+ HeaderKey2+":"+HeaderValue2+"\n"\+ ... HeaderKeyN+":"+HeaderValueN+"\n"

将 Headers 签名中 Header 的 Key 使用英文逗号分割放到 Request 的 Header 中,Key为:X-Ca-Signature-Headers。

Url

Url 指 Path + Query + Body 中 Form 参数,组织方法:对 Query+Form 参数按照字典对 Key 进行排序后按照如下方法拼接,如果 Query 或 Form 参数为空,则 Url = Path,不需要添加 ?,如果某个参数的 Value 为空只保留 Key 参与签名,等号不需要再加入签名。

String url = Path+ "?"+ Key1+"="+Value1+ "&"+Key2+"="+Value2+ ... "&"+KeyN+"="+ValueN

注意这里 Query 或 Form 参数的 Value 可能有多个,多个的时候只取第一个 Value 参与签名计算。

计算签名

Mac hmacSha256 =Mac.getInstance("HmacSHA256"); byte[] keyBytes = secret.getBytes("UTF-8"); hmacSha256.init(newSecretKeySpec(keyBytes,0, keyBytes.length,"HmacSHA256")); String sign =newString(Base64.encodeBase64(hmacSha256.doFinal(stringToSign.getBytes("UTF-8")),"UTF-8"));

secret 为 APP 的密钥。

传递签名

将计算的签名结果放到 Request 的 Header 中,Key为:X-Ca-Signature。

签名错误排查方法

当签名校验失败时,API网关会将服务端的 StringToSign 放到 HTTP Response 的 Header 中返回到客户端,Key为:X-Ca-Error-Message,只需要将本地计算的 StringToSign 与服务端返回的 StringToSign 进行对比即可找到问题;

如果服务端与客户端的 StringToSign 一致请检查用于签名计算的密钥是否正确;

因为 HTTP Header 中无法表示换行,因此 StringToSign 中的换行符都被过滤掉了,对比时请忽略换行符。

签名 demo

使用demo前提醒:1、使用以下demo,请勿修改任何代码字符,只能修改友盟appkey、阿里云appkey、阿里云appSecret和调用地址。2、调用地址请按照产品订购页面的实际地址修改填写,若调用地址不对则会提示A400IK报错,正确的调用地址如下:

  • 【友盟+】智能认证 U-Verify(一键登录):本机号码认证调用地址:http(s)://verify5.market.alicloudapi.com/api/v1/mobile/verify

  • 【友盟+】智能认证 U-Verify(一键登录):一键登录调用地址:http(s)://verify5.market.alicloudapi.com/api/v1/mobile/info

demo参考以下:

签名计算的详细 demo(JAVA)请直接下载:签名计算的详细demo(JAVA)

签名计算的详细 demo(php)请直接下载:签名计算的详细demo(php)

签名计算的详细 demo(python)请参照链接:签名计算的详细demo(Python)

签名计算的详细 demo(go)请参考链接:签名计算的详细demo(go)

该文档内容是否给您带来了帮助?
赞同
反对
为了不断改善我们的文档质量,请问您在阅读文档中是否遇到了以下相关问题?
选择图片

null

点击或拖拽上传图片

相关视频