API认证简介
开发者可以通过两种方式与开放平台api进行交互,包括认证方式和匿名方式。
对于认证方式,需要通过使用Access Key Id / Secret Access Key加密的方法来验证某个请求的发送者身份。Access Key Id(AK)用于标示用户,Secret Access Key(SK)是用户用于加密认证字符串和开放平台用来验证认证字符串的密钥,其中SK必须保密,只有用户和开放平台知道。
当开放平台接收到用户的请求后,系统将使用相同的SK和同样的认证机制生成认证字符串,并与用户请求中包含的认证字符串进行比对。如果认证字符串相同,系统认为用户拥有指定的操作权限,并执行相关操作;如果认证字符串不同,系统将忽略该操作并返回错误码。
Java client sdk下载
示例工程下载
名词解释
API认证方式
开放平台API使用基于认证字符串的HTTP请求签名机制来验证用户身份。对于每个HTTP请求,都需要携带一个认证字符串然后通过http header将这个认证字符串包含在请求中:
在HTTP Header中包含认证字符串
通常使用的方法是在HTTP请求的Authorization头域中包含认证字符串,除了匿名请求之外,所有与开放平台的交互都应该包含该字段。
步骤(必读)
4.1 申请认证账号和密钥(AK/SK),可参见帮助文章 已创建应用,如何申请Access Key 、Secret Access
4.2 对每个将要发起的请求,携带必要的http header信息
Date: Thu, 22 Jun 2017 17:15:21 GMT
Authorization: hmac username="myUserName", algorithm="hmac-sha256", headers="date request-line host", signature="ujWCGHeec9Xd6UD2zlyxiNMCiXnDOWeVFMu5VeRUxtw="
其中:Date、Authorization均为http协议中的通用头部信息
Date规范可参见 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Date
Authorization 为本平台指定的签名算法
4.2.1 username=”myUserName” 中的myUserName为认证账号,即AK
4.2.2 digest=HMAC-SHA256(
4.2.3 signature的签名信息包含了date信息,服务端会对date信息进行过期校验,有效期为5分钟
signature的计算逻辑如下:
signing_string="date: Thu, 22 Jun 2017 17:15:21 GMT\nGET /requests HTTP/1.1\nhost: xxx.xxx.com"
digest=HMAC-SHA256(<signing_string>, "mySecret")
base64_digest=base64(<digest>)
signature = base64_digest
signing_string说明:时间 请求的request-line 请求的host,如:需要请求接口 https://mvp.gw.101.com/oauth/access_token POST请求的,则signing_string 为”date: Thu, 22 Jun 2017 17:15:21 GMT\nPOST /oauth/access_token HTTP/1.1\nhost: mvp.gw.101.com”,这里的顺序是date request-line host,与上面的Authorization: hmac username=”myUserName”, algorithm=”hmac-sha256”, headers=”date request-line host”, signature=”ujWCGHeec9Xd6UD2zlyxiNMCiXnDOWeVFMu5VeRUxtw=” 中headers的顺序一致就行,无需强制要求这个顺序,校验时也是根据headers中顺序解密匹配
使用SDK发送请求(必读)
开发人员可以使用开放平台提供的SDK来帮助发送接口请求,SDK自动在请求发起前补充认证信息
//sdk使用样例, 基于apache http client
public Object execute(JSONObject token) throws IOException {
String GATEWAY_HOST = "https://mvp.gw.101.com";//网关地址
String GATEWAY_GET_URL = "https://mvp.gw.101.com/base/subjects";//具体的请求地址,域名与上面一致
HttpClient httpClient = NdHttpClientBuilder.getHttpClient("YOUR REAL AK","YOUR REAL SK");//此类由sdk提供
HttpRequest request = new HttpGet(GATEWAY_GET_URL);
request.setHeader("idp-open-id",token.getString("open_id"));//需要用户信息必传
request.setHeader("idp-access-token",token.getString("access_token"));//需要用户信息必传
request.setHeader("sdp-app-id",SDP_APP_ID);
request.setHeader("OPF-APP-ID",OPEN_APP_ID);//开放平台的应用id,为特殊接口需要,非必须
request.setHeader("Content-Type","application/json");
HttpHost httpHost = HttpHost.create(GATEWAY_HOST);
HttpResponse httpResponse = httpClient.execute(httpHost,request);
return EntityUtils.toString(httpResponse.getEntity());
}
header字段说明
HEADER 字段 | 是否必选 | 用途 | 说明 |
---|---|---|---|
idp-open-id | 可选 | 用户openid | 若请求的接口需要用户相关信息时必传 |
idp-access-token | 可选 | 用户access_token | 若请求的接口需要用户相关信息时必传 |
sdp-app-id | 必选 | 租户ID | |
sdp-biz-type | 可选 | 业务类型 | 如果有颁发biz-tyupe,必传 |
sdp-org-id | 可选 | 组织ID | 如果有提供org-id,必传 |
Content-Type | 必选 | 标准头 | application/json |
OPF-APP-ID | 可选 | 开放平台应用ID | 特定接口需要必传,具体看接口说明文档 |
重要说明
- sdp-app-id信息为创建应用后,系统自动生成的固定值
查看位置:开放平台-开发文档-接口调用,如图:
更新时间:2023-11-14 10:57