天天看點

oepnApi網關分享

一、概念

OAuth:OAuth協定緻力于使網站和應用程式(統稱為消費方)能夠在無須使用者透露其認證證書的情況下,通過API通路某個web服務(統稱為服務提供方)的受保護資源。更一般地說,OAuth為API認證提供了一個可自由實作且通用的方法。 

AppID:服務的唯一辨別(ID),用于網關使用者認證。

AccessToken: 服務API通路憑證,由OpenAPI網關負責生成及校驗。

JsApi: 使用native開發的SDK,包含了一組可提供給H5調用的一組JSAPI接口

簽名(signature): 把使用者的身份資訊按一定的規則組合并以約定好的安全加密算法進行加密後的字元串,用于各個應用服務在調用openApi網關時進行臨時身份授權認證。

二、為什麼使用openApi網關

為什麼使用openApi網關?Open API 即開放 API,也稱開放平台。 所謂的開放 API(OpenAPI)是服務型網站常見的一種應用,網站的服務商将自己的網站服務封裝成一系列

API(Application Programming Interface,應用程式設計接口)開放出去,供第三方開發者使用,這種行為就叫做開放網站的 API,所開放的 API 就被稱作 OpenAPI(開放 API )。openApi網關是一個統一的開放API資料交換平台,提供了對所有使用者開放API請求的合法性、安全性校驗,同時提供流控控制,保障後端服務資料的安全。

openApi網關是基于OAuth2.0鑒權的服務網關,它為應用服務提供了統一的接入标準及安全鑒權。應用服務使用OpenApi前,必須拿到由openApi網關頒發的accessToken,通過accessToken來實作對調用請求的合法性進行鑒權與校驗。

openApi可以結合JsApi實作WEB端對API接口的直接通路。移動端H5服務需要對接openApi時,通過在原生層開發JsApi SDK向H5提供服務調用,然後再通過原生層把使用者請求轉發到openApi網關。JsApi進行通路的合法性及安全性通過使用臨時簽名(signature)來實作。簽名的生成由JsApi與網關服務分别按約定好的加密算法生成,包含了使用者身份資訊的加密字元串。H5在開始JsApi調用前,先通過傳入網關認證過的使用者身份ID(AppId)和密鑰從網關服務中計算出一個臨時的簽名。然後H5在進行JsApi 的所有函數調用時,由JsApi按相同規則計算出一個相同的簽名串來校驗目前請求是否合法。使用者請求進入openApi網關後,網關同樣提供了驗證簽名的能力,保證簽名的合法性和時效性,進而保證使用者端請求安全。

三、openApi 開發使用

1、擷取openApi accessToken

• 第一步:服務接入方提出服務接入申請

• 第二步:管理者注冊服務生成APPID和APPSecret等資訊

• 第三步:将APPID,APPSecret等資訊線下提供給第三方服務

• 第四步:第三方服務使用APPID,APPSecret請求接口擷取授權碼accessToken

Request:

POST /v1/access-token HTTP/1.1

Body:

{

"appId": "xx",

"appSecret": "xxxx"

}

Cache-Control: no-cache

Accept: application/json

Response:

"accessToken": "xxx",

"expiresIn": 28800,

"refreshToken": "xxx"

2、OpenApi accessToken 類型通路憑證(下面簡稱 accessToken)具有以下用途:

通路應用服務 Api。

Server to server 的通路。

JsApi 驗簽。

采用以下流程擷取:

oepnApi網關分享

如果是H5端通過JsAPI直接通路openApi接口,則在擷取到此 accessToken 後,還需要一個臨時簽名資訊,具體操作如下:

1)JsApi 簽名操作

為了 JsApi 的調用安全,會在 JsApi 的所有函數調用前判斷是否已經通過簽名(signature)驗證,那麽在 JsApi.initialize 函數傳入正确的簽名就是後續使用 JsApi 的前提條件。同時 signature 隻在目前 URL 有效,切換 URL 位址後需要重新簽名并調用 JsApi.initialize 函數。

oepnApi網關分享

簽名算法:

參與簽名的字段包括 nonce(随機字元串), 有效的 OpenApi accessToken, timestamp(時間戳), url(目前網頁的 URL,不包含#及其後面部分) 。對所有待簽名參數按照字段名的 ASCII 碼從小到大排序(字典序)後,使用 URL 鍵值對的格式(即 key1=value1&key2=value2…)拼接成字元串 string1。這裡需要注意的是所有參數名均為小寫字元。對 string1 作 sha256 加密,字段名和字段值都采用原始值,不進行 URL 轉義。 即 signature=sha256(string1)。 示例:

nonce=Wm3WZYTPz0wzccnW

accessToken=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg

timestamp=1414587457

url=

http://www.gov.mo?params=value

步驟 1. 對所有待簽名參數按照字段名的 ASCII 碼從小到大排序(字典序)後,使用 URL 鍵值對的格式(即 key1=value1&key2=value2…)拼接成字元串 string1:accessToken=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&nonce=Wm3WZYTPz0wzccnW&timestamp=1414587457&url=

步驟 2. 對 string1 進行 sha256 簽名(使用 UTF-8 編碼),得到 signature:0f9de62fce790f9a083d5c99e95740ceb90c27ed

注意事項

a) 簽名用的nonce和timestamp必須與JsApi.initialize中的nonce和timestamp相同。

b) 簽名用的 url 必須是調用 JS 接口頁面的完整 URL。

c) 出于安全考慮,開發者必須在伺服器端實作簽名的邏輯。

2)調用通用模組

擷取到 accessToken 之後,請在伺服器妥善儲存,然後放到每個 Request Header 中即可。

GET /v1/address?kw=xxx HTTP/1.1

Host:

Authorization: Bearer dT2eRwgOsKqWf9JR4gwqSVC8MO88gr

Accept-Language: zh-Hant

繼續閱讀