天天看点

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

继续阅读