访问入口及协议

域名

每个API服务都属于一个API分组,每个API分组有不同的域名。域名是由服务端绑定的独立域名,API网关通过域名来寻址定位API分组。 域名的格式为 www.[独立域名].com/[Path]?[HTTPMethod],在公测阶段,API使用者需要在线下从API提供者处获取此域名。 云API网关通过域名定位到一个唯一的分组,通过Path+HTTPMethod确定该分组下唯一的API。 您需要在线下从API服务商处获取API文档,其中会包含域名、Path等必要参数信息。

系统级Header

【必选】X-Ca-Key:API调用者传递AppKey 【必选】X-Ca-Signature:API加签签名 【可选】X-Ca-Timestamp:API调用者传递时间戳,为时间转换为毫秒的值,也就是从1970年1月1日起至今的时间转换为毫秒,可选,默认15分钟内有效 【可选】X-Ca-Nonce:API调用者自定义请求UUID,结合时间戳防重放,可选,使用时需要配合时间戳 【可选】Content-MD5当请求Body为Stream时,可以计算Body的MD5值传递给云网关校验 【可选】X-Ca-Stage请求API所属Stage,目前仅支持test和release,如果不传递,默认release。

签名校验

组织参与签名计算的字符串
String stringToSign= 
HTTPMethod + "\n" + 
Accept + "\n" + 
Content-MD5 + "\n" 
Content-Type + "\n" + 
Date + "\n" + 
Headers + "\n" + 
Url + "\n"
说明

HTTPMethod为全大写

Accept、Content-MD5、Content-Type、Date、Headers、Url、如果为空也需要添加换行符"\n"

Content-MD5

Content-MD5是指Body的MD5值,只有当Body为Stream时才计算MD5,计算方式为:

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

Headers指所有参与签名计算的Header的Key、Value,这里要注意参与签名计算的Header是不包含X-Ca-Signature、X-Ca-Signature-Headers的。

Headers组织方法:

先对所有参与签名计算的Header的Key按照字典排序,然后按照如下方式拼接:

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

Url指Path + Query + Body中Form参数,组织方法:

对Query+Form参数按照字典对Key进行排序后按照如下方法拼接,如果Query或Form参数为空,则Uri = Path,不需要添加"?" \

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(new SecretKeySpec(keyBytes, 0, keyBytes.length, "HmacSHA256"));
String sign = new String(Base64.encodeBase64(Sha256.doFinal(stringToSign.getBytes("UTF-8")),"UTF-8"));

secret是您创建的APP的AppSecret

传递签名

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

将所有参与加签的Header的Key使用应为逗号分割放到Request的Header中,Key为:X-Ca-Signature-Headers

时间戳校验

Content-MD5

Content-MD5是指Body的MD5值,只有当Body为Stream时才计算MD5,计算方式为:

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

results matching ""

    No results matching ""