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头域中包含认证字符串,除了匿名请求之外,所有与开放平台的交互都应该包含该字段。

步骤(必读)

  1. Date: Thu, 22 Jun 2017 17:15:21 GMT
  2. 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(, “mySecret”) 中的mySecret为认证秘钥,即SK

4.2.3 signature的签名信息包含了date信息,服务端会对date信息进行过期校验,有效期为5分钟

signature的计算逻辑如下:

  1. signing_string="date: Thu, 22 Jun 2017 17:15:21 GMT\nGET /requests HTTP/1.1\nhost: xxx.xxx.com"
  2. digest=HMAC-SHA256(<signing_string>, "mySecret")
  3. base64_digest=base64(<digest>)
  4. 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自动在请求发起前补充认证信息

  1. //sdk使用样例, 基于apache http client
  2. public Object execute(JSONObject token) throws IOException {
  3. String GATEWAY_HOST = "https://mvp.gw.101.com";//网关地址
  4. String GATEWAY_GET_URL = "https://mvp.gw.101.com/base/subjects";//具体的请求地址,域名与上面一致
  5.    HttpClient httpClient = NdHttpClientBuilder.getHttpClient("YOUR REAL AK","YOUR REAL SK");//此类由sdk提供
  6.    HttpRequest request = new HttpGet(GATEWAY_GET_URL);
  7.    request.setHeader("idp-open-id",token.getString("open_id"));//需要用户信息必传
  8.    request.setHeader("idp-access-token",token.getString("access_token"));//需要用户信息必传
  9.    request.setHeader("sdp-app-id",SDP_APP_ID);
  10.    request.setHeader("OPF-APP-ID",OPEN_APP_ID);//开放平台的应用id,为特殊接口需要,非必须
  11.    request.setHeader("Content-Type","application/json");
  12.    HttpHost httpHost = HttpHost.create(GATEWAY_HOST);
  13.    HttpResponse httpResponse = httpClient.execute(httpHost,request);
  14.    return EntityUtils.toString(httpResponse.getEntity());
  15. }

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信息为创建应用后,系统自动生成的固定值

查看位置:开放平台-开发文档-接口调用,如图:

作者:wangtc  创建时间:2019-08-30 21:02
 更新时间:2023-11-14 10:57