• 沒有找到結果。

创建用于后端自定义认证的函数_API网关 APIG_开发指南_华为云

N/A
N/A
Protected

Academic year: 2022

Share "创建用于后端自定义认证的函数_API网关 APIG_开发指南_华为云"

Copied!
102
0
0

加載中.... (立即查看全文)

全文

(1)

开发指南

文档版本 12

发布日期 2021-12-08

(2)

非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传 播。

商标声明

和其他华为商标均为华为技术有限公司的商标。

本文档提及的其他所有商标或注册商标,由各自的所有人拥有。

注意

您购买的产品、服务或特性等应受华为公司商业合同和条款的约束,本文档中描述的全部或部分产品、服务或 特性可能不在您的购买或使用范围之内。除非合同另有约定,华为公司对本文档内容不做任何明示或暗示的声 明或保证。

由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,本文 档中的所有陈述、信息和建议不构成任何明示或暗示的担保。

(3)

目 录

1 概述...1

2 如何选择认证方式... 2

3 使用 APP 认证调用 API...3

3.1 认证前准备... 3

3.2 APP 认证工作原理... 4

3.3 Java...9

3.4 Go... 21

3.5 Python...25

3.6 C#... 29

3.7 JavaScript... 30

3.8 PHP... 37

3.9 C++... 40

3.10 C... 42

3.11 Android...45

3.12 curl... 47

4 使用 IAM 认证调用 API... 49

4.1 Token 认证... 49

4.2 AK/SK 认证...51

5 创建用于前端自定义认证的函数...53

6 创建用于后端自定义认证的函数...58

7 对后端服务进行签名... 62

7.1 Java... 62

7.2 Python...68

7.3 C#... 74

8 导入导出 API... 79

8.1 限制与兼容性说明... 79

8.2 导入 API... 82

8.3 导出 API... 82

8.4 扩展定义... 83

8.5 导入 API 示例... 96

(4)

1 概述

● 第二章~第四章指导API调用者通过不同认证方式调用API。

● 第五章~第六章指导使用自定义认证调用API。

● 第七章指导API提供者通过创建后端签名,确保后端服务的安全。

● 第八章指导API提供者将Swagger格式的API导入API网关,并指导API提供者和API

调用者将API网关中的API导出。

(5)

2 如何选择认证方式

如果您是 API 提供者

调用接口有如下认证方式,您可以选择其中一种进行认证鉴权。

APP认证(推荐)

通过API网关提供的AppKey和AppSecret进行签名认证。

a. 支持发布到应用市场。

b. 使用对象为API网关服务租户。

IAM认证

支持Token认证和AK/SK认证两种。

– Token认证:通过Token认证调用请求。Token认证无需使用SDK签名,优先 使用Token认证。

– AK/SK认证:通过AK(Access Key ID)/SK(Secret Access Key)签名调用 请求。其签名方式和APP认证相似。

IAM认证不支持发布到应用市场。使用对象为API网关服务租户。

● 自定义认证

如果您希望使用自己的认证方式,可以在函数服务中编写一个函数,将其作为您 的认证服务。有关API调用的认证帮助,请参考创建用于前端自定义认证的函数。

● 无认证

API网关对请求不进行认证。

a. 不支持发布到应用市场。

b. 使用对象为任何公网用户。

如果您是 API 调用者

1. 从云市场获取API,请在云市场的API售卖入口获取API使用指导,确定认证方式 后,然后参考本指南中相应认证方式调用API。

2. 通过线下获取API,请联系API提供者确定认证方式,然后参考本指南中相应认证 方式调用API。

(6)

3 使用 APP 认证调用 API

3.1 认证前准备

APP认证方式调用API,需要提前获取如下信息:

● 访问服务前,首先需要得到API的域名、请求url和请求方法。

在API详情中的“调用信息 > 前端请求”中查看API的域名、请求url和请求方法。

3-1 API 基础定义

(7)

3-2 运行环境信息

● 对于APP认证的API,您必须提供有效的AppKey、AppSecret才能够生成认证签 名。

在“应用管理”中生成一个APP,并将APP绑定到API,就可以使用APP对应的 AppKey和AppSecert访问该API。可在应用详细信息中查看AppKey和AppSecret。

3-3 查看 AppKey 和 AppSecret

说明

● AppKey:APP访问密钥ID。与私有访问密钥关联的唯一标识符;访问密钥ID和私有访 问密钥一起使用,对请求进行加密签名。

● AppSecret:与访问密钥ID结合使用的密钥,对请求进行加密签名,可标识发送方,并 防止请求被修改。

● 发送API请求时,需要将当前时间置于请求消息头的X-Sdk-Date,将签名信息置于 请求消息头的Authorization。

注意

客户端须注意本地时间与时钟服务器的同步,避免请求消息头X-Sdk-Date的值出 现较大误差。

API网关除了校验时间格式外,还会校验该时间值与网关收到请求的时间差,如果 时间差超过15分钟,API网关将拒绝请求。

3.2 APP 认证工作原理

1. 构造规范请求。

将待发送的请求内容按照与API网关(即API管理)后台约定的规则组装,确保客 户端签名、API网关后台认证时使用的请求内容一致。

(8)

2. 使用规范请求和其他信息创建待签字符串。

3. 使用AK/SK和待签字符串计算签名。

4. 将生成的签名信息作为请求消息头添加到HTTP请求中,或者作为查询字符串参数 添加到HTTP请求中。

5. API网关收到请求后,执行1~3,计算签名。

6. 将3中的生成的签名与5中生成的签名进行比较,如果签名匹配,则处理请求,否 则将拒绝请求。

说明

APP签名仅支持Body体12M及以下的请求签名。

步骤 1:构造规范请求

使用APP方式进行签名与认证,首先需要规范请求内容,然后再进行签名。客户端与 API网关使用相同的请求规范,可以确保同一个HTTP请求的前后端得到相同的签名结 果,从而完成身份校验。

HTTP请求规范伪代码如下:

CanonicalRequest =

HTTPRequestMethod + '\n' + CanonicalURI + '\n' + CanonicalQueryString + '\n' + CanonicalHeaders + '\n' + SignedHeaders + '\n' +

HexEncode(Hash(RequestPayload))

通过以下示例来说明规范请求的构造步骤。

假设原始请求如下:

GET https://c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com/app1?b=2&a=1 HTTP/1.1 Host: c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com

X-Sdk-Date: 20191111T093443Z

1. 构造HTTP请求方法(HTTPRequestMethod),以换行符结束。

HTTP请求方法,如GET、PUT、POST等。请求方法示例:

GET

2. 添加规范URI参数(CanonicalURI),以换行符结束。

释义:

规范URI,即请求资源路径,是URI的绝对路径部分的URI编码。

格式:

根据RFC 3986标准化URI路径,移除冗余和相对路径部分,路径中每个部分必须 为URI编码。如果URI路径不以“/”结尾,则在尾部添加“/”。

举例:

示例中的URI:/app1,此时规范的URI编码为:

(9)

查询字符串,即查询参数。如果没有查询参数,则为空字符串,即规范后的请求 为空行。

格式:

规范查询字符串需要满足以下要求:

– 根据以下规则对每个参数名和值进行URI编码:

请勿对RFC 3986定义的任何非预留字符进行URI编码,这些字符包括:

A-Z、a-z、0-9、-、_、.和~。

使用%XY对所有非预留字符进行百分比编码,其中X和Y为十六进制字符

(0-9和A-F)。例如,空格字符必须编码为%20,扩展UTF-8字符必须 采用“%XY%ZA%BC”格式。

– 对于每个参数,追加“URI编码的参数名称=URI编码的参数值”。如果没有 参数值,则以空字符串代替,但不能省略“=”。

例如以下含有两个参数,其中第二个参数parm2的值为空。

parm1=value1&parm2=

– 按照字符代码以升序顺序对参数名进行排序。例如,以大写字母F开头的参数 名排在以小写字母b开头的参数名之前。

– 以排序后的第一个参数名开始,构造规范查询字符串。

举例:

示例中包含两个可选参数:a、b

GET/app1/

a=1&b=2

4. 添加规范消息头(CanonicalHeaders),以换行符结束。

释义:

规范消息头,即请求消息头列表。包括签名请求中的所有HTTP消息头列表。消息 头必须包含X-Sdk-Date,用于校验签名时间,格式为ISO8601标准的UTC时间格 式:YYYYMMDDTHHMMSSZ。如果API发布到非RELEASE环境时,需要增加自定 义的环境名称。

须知

客户端须注意本地时间与时钟服务器的同步,避免请求消息头X-Sdk-Date的值出 现较大误差。

API网关除了校验时间格式外,还会校验该时间值与网关收到请求的时间差,如果 时间差超过15分钟,API网关将拒绝请求。

格式:

CanonicalHeaders由多个请求消息头共同组成,CanonicalHeadersEntry0 + CanonicalHeadersEntry1 + ...,其中每个请求消息头

(CanonicalHeadersEntry)的格式为Lowercase(HeaderName) + ':' + Trimall(HeaderValue) + '\n'

(10)

说明

● Lowercase表示将所有字符转换为小写字母的函数。

● Trimall表示删除值前后的多余空格的函数。

● 最后一个请求消息头也会携带一个换行符。叠加规范中CanonicalHeaders自身携带的 换行符,因此会出现一个空行。

● 消息头名称要保持唯一性,出现多个相同消息头名称时,无法完成认证。

举例:

GET/app1/

a=1&b=2

host:c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com x-sdk-date:20191111T093443Z

须知

规范消息头需要满足以下要求:

● 将消息头名称转换为小写形式,并删除前导空格和尾随空格。

● 按照字符代码对消息头名称进行升序排序。

例如原始消息头为:

Host: c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com\n Content-Type: application/json;charset=utf8\n

My-header1: a b c \n X-Sdk-Date:20191111T093443Z\n My-Header2: "a b c" \n

规范消息头为:

content-type:application/json;charset=utf8\n

host:c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com\n my-header1:a b c\n

my-header2:"a b c"\n x-sdk-date:20191111T093443Z\n

5. 添加用于签名的消息头声明(SignedHeaders),以换行符结束。

释义:

用于签名的请求消息头列表。通过添加此消息头,向API网关告知请求中哪些消息 头是签名过程的一部分,以及在验证请求时API网关可以忽略哪些消息头。X-Sdk- date必须作为已签名的消息头。

格式:

SignedHeaders = Lowercase(HeaderName0) + ';' + Lowercase(HeaderName1) + ";" + ...

已签名的消息头需要满足以下要求:将已签名的消息头名称转换为小写形式,按 照字符代码对消息头进行排序,并使用“;”来分隔多个消息头。

Lowercase表示将所有字符转换为小写字母。

(11)

6. 基于HTTP或HTTPS请求正文中的body体(RequestPayload),使用SHA-256哈 希函数创建哈希值。

释义:

请求消息体。消息体需要做两层转换:HexEncode(Hash(RequestPayload)),其 中Hash表示生成消息摘要的函数,当前支持SHA-256算法。HexEncode表示以小 写字母形式返回摘要的Base-16编码的函数。例如,HexEncode("m") 返回值为

“6d”而不是“6D”。输入的每一个字节都表示为两个十六进制字符。

说明

计算RequestPayload的哈希值时,对于“RequestPayload==null”的场景,直接使用空字 符串""来计算。

举例:

本示例为GET方法,body体为空。经过哈希处理的body(空字符串)如下:

GET/app1/

a=1&b=2

host:c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com x-sdk-date:20191111T093443Z

host;x-sdk-date

e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

7. 对构造好的规范请求进行哈希处理,算法与对RequestPayload哈希处理的算法相 同。经过哈希处理的规范请求必须以小写十六进制字符串形式表示。

算法伪代码:Lowercase(HexEncode(Hash.SHA256(CanonicalRequest))) 经过哈希处理的规范请求示例:

af71c5a7ef45310b8dc05ab15f7da50189ffa81a95cc284379ebaa5eb61155c0

步骤 2:创建待签字符串

对HTTP请求进行规范并取得请求的哈希值后,将其与签名算法、签名时间一起组成待 签名字符串。

StringToSign = Algorithm + \n + RequestDateTime + \n + HashedCanonicalRequest

伪代码中参数说明如下。

Algorithm

签名算法。对于SHA 256,算法为SDK-HMAC-SHA256。

RequestDateTime

请求时间戳。与请求消息头X-Sdk-Date的值相同,格式为 YYYYMMDDTHHMMSSZ。

HashedCanonicalRequest 经过哈希处理的规范请求。

上述例子得到的待签字符串为:

SDK-HMAC-SHA256 20191111T093443Z

af71c5a7ef45310b8dc05ab15f7da50189ffa81a95cc284379ebaa5eb61155c0

(12)

步骤 3:计算签名

将APP secret和创建的待签字符串作为加密哈希函数的输入,计算签名,将二进制值转 换为十六进制表示形式。

伪代码如下:

signature = HexEncode(HMAC(APP secret, string to sign))

其中HMAC指密钥相关的哈希运算,HexEncode指转十六进制。伪代码中参数说明如 表3-1所示。

3-1 参数说明

参数名称 参数解释

APP secret 签名密钥

string to sign 创建的待签字符串

假设APP secret为FWTh5tqu2Pb9ZGt8NI09XYZti2V1LTa8useKXMD8,则计算得到的 signature为:

01cc37e53d821da93bb7239c5b6e1640b184a748f8c20e61987b491e00b15822

步骤 4:添加签名信息到请求头

在计算签名后,将它添加到Authorization的HTTP消息头。Authorization消息头未包 含在已签名消息头中,主要用于身份验证。

伪代码如下:

Authorization header创建伪码:

Authorization: algorithm Access=APP key, SignedHeaders=SignedHeaders, Signature=signature

需要注意的是算法与Access之前没有逗号,但是SignedHeaders与Signature之前需要 使用逗号隔开。

得到的签名消息头为:

Authorization: SDK-HMAC-SHA256 Access=FM9RLCN************NAXISK, SignedHeaders=host;x-sdk-date, Signature=01cc37e53d821da93bb7239c5b6e1640b184a748f8c20e61987b491e00b15822

得到签名消息头后,将其增加到原始HTTP请求内容中,请求将被发送给API网关,由 API网关完成身份认证。身份认证通过后,该请求才会发送给后端服务进行业务处理。

3.3 Java

(13)

3-4 调用流程

前提条件

● 已获取API的域名、请求url、请求方法、AppKey和AppSecret等信息,具体参见认 证前准备。

● 已安装Eclipse 3.6.0或以上版本,如果未安装,请至Eclipse官方网站下载。

● 已安装Java Development Kit 1.8.111或以上版本,如果未安装,请至Oracle官方 下载页面下载。

获取 SDK

请登录API网关控制台,参考《用户指南》的“SDK”章节,进入SDK页面并下载 SDK。

或直接下载SDK的最新版本,获取“ApiGateway-java-sdk.zip”压缩包,解压后目录 结构如下:

名称 说明

libs\ SDK依赖库

libs\java-sdk-core-x.x.x.jar SDK包 src\com\apig\sdk\demo

\Main.java 使用SDK签名请求示例代码 src\com\apig\sdk\demo

\OkHttpDemo.java src\com\apig\sdk\demo

\LargeFileUploadDemo.jav a

.classpath Java工程配置文件 .project

(14)

如果使用maven构建,SDK包中“java-sdk-core-x.x.x.jar”的maven仓库地址为

https://mirrors.huaweicloud.com/repository/maven/huaweicloudsdk/,配置

maven源的方法可参见https://bbs.huaweicloud.com/forum/forum.php?

mod=viewthread&tid=1779。

加入java-sdk-core依赖的maven配置项为:

<dependency>

<groupId>com.huawei.apigateway</groupId>

<artifactId>java-sdk-core</artifactId>

<version>SDK包版本号</version>

</dependency>

说明

使用maven构建时,settings.xml文件需要修改,增加以下内容:

1. 在profiles节点中添加如下内容:

<profile>

<id>MyProfile</id>

<repositories>

<repository>

<id>HuaweiCloudSDK</id>

<url>https://mirrors.huaweicloud.com/repository/maven/huaweicloudsdk/</url>

<releases>

<enabled>true</enabled>

</releases>

<snapshots>

<enabled>false</enabled>

</snapshots>

</repository>

</repositories>

<pluginRepositories>

<pluginRepository>

<id>HuaweiCloudSDK</id>

<url>https://mirrors.huaweicloud.com/repository/maven/huaweicloudsdk/</url>

<releases>

<enabled>true</enabled>

</releases>

<snapshots>

<enabled>false</enabled>

</snapshots>

</pluginRepository>

</pluginRepositories>

</profile>

2. 在mirrors节点中增加:

<mirror>

<id>huaweicloud</id>

<mirrorOf>*,!HuaweiCloudSDK</mirrorOf>

<url>https://mirrors.huaweicloud.com/repository/maven/</url>

</mirror>

3. 增加activeProfiles标签激活配置:

<activeProfiles>

(15)

步骤2 选择“General > Existing Projects into Workspace”,单击“Next”。

弹出“Import Projects”对话框。

3-5 Import

步骤3 单击“Browse”,在弹出的对话框中选择解压后的SDK路径。

(16)

3-6 选择 demo 工程

步骤4 单击“Finish”,完成工程导入。

“Main.java”为示例代码,请根据实际情况修改参数后使用。具体代码说明请参考调 用API示例。

----结束

(17)

3-7 新建工程

步骤3 导入API Gateway Java SDK的“jar”文件。

1. 选择“java-sdk-demo”,单击鼠标右键,选择“Build Path > Add External Archives”。

(18)

3-8 导入 jar 文件

2. 选择SDK中“\libs”目录下所有以“jar”结尾的文件,单击“打开”。

3-9 选择 jar 文件

步骤4 新建“Package”及“Main”文件。

1. 选择“src”,单击鼠标右键,选择“New > Package”。

3-10 新建 Package

(19)

3-11 设置 Package 的名称

3. 单击“Finish”。

完成“Package”的创建。

4. 选择“com.apig.sdk.demo”,单击鼠标右键,选择“New > Class”。

3-12 新建 Class

5. 在“Name”中输入“Main”,勾选“public static void main(String[]

args)”。

(20)

3-13 设置 Class 的配置

6. 单击“Finish”。

完成“Main”文件的创建。

步骤5 完成工程创建后,最终目录结构如下。

(21)

3-14 新建工程 Main 的目录结构

“Main.java”无法直接使用,请根据实际情况参考下文调用API示例输入所需代码。

----结束

调用 API 示例

说明

● 您需要在控制台创建一个API,可以选择Mock模式,并发布到环境上。创建及发布API的步 骤请参见用户指南。

● 示例API的后端为打桩的HTTP服务,此后端返回一个“200”响应码及“Congratulations, sdk demo is running”消息体。

步骤1 在“Main.java”中加入以下引用。

import java.io.IOException;

import javax.net.ssl.SSLContext;

import org.apache.http.Header;

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.client.methods.HttpRequestBase;

import org.apache.http.conn.ssl.AllowAllHostnameVerifier;

import org.apache.http.conn.ssl.SSLConnectionSocketFactory;

import org.apache.http.conn.ssl.SSLContexts;

import org.apache.http.conn.ssl.TrustSelfSignedStrategy;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.util.EntityUtils;

import com.cloud.apigateway.sdk.utils.Client;

import com.cloud.apigateway.sdk.utils.Request;

步骤2 创建request,过程中需要用到如下参数。

● AppKey:通过认证前准备获取。根据实际情况填写,示例代码使用

“4f5f626b-073f-402f-a1e0-e52171c6100c”作为样例。

● AppSecret:通过认证前准备获取。根据实际情况填写,示例代码使用“******”作 为样例。

(22)

● Method:请求的方法名。根据API实际情况填写,示例代码使用“POST”作为样 例。

● url:请求的url,不包含QueryString及fragment部分。域名部分请使用绑定域名 时,您自己绑定的独立域名或上架云市场时申请云市场颁发的域名。示例代码使 用“http://c967a237-cd6c-470e-906f-a8655461897e.apigw.cn-

north-1.huaweicloud.com/java-sdk”作为样例。

● queryString: url携带参数的部分,根据API实际情况填写。支持的字符集为[0-9a- zA-Z./;[]\-=~#%^&_+: "]。示例代码使用“name=value”作为样例。

● header:请求的头域。根据API实际情况填写,不支持中文和下划线。示例代码使 用“Content-Type:text/plain”作为样例。如果API发布到非RELEASE环境时,需 要增加自定义的环境名称,示例代码使用“x-stage:publish_env_name”作为样 例。

● body:请求的正文。根据API实际情况填写,示例代码使用“demo”作为样例。

样例代码如下:

Request request = new Request();

try {

request.setKey("4f5f626b-073f-402f-a1e0-e52171c6100c"); //创建应用时得到 request.setSecret("*****"); //创建应用时得到

request.setMethod("POST");

request.setUrl("http://c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com/java- sdk");

//url地址

request.addQueryStringParam("name", "value");

request.addHeader("Content-Type", "text/plain");

//request.addHeader("x-stage", "publish_env_name"); //如果API发布到非RELEASE环境,需要增加自 定义的环境名称

request.setBody("demo");

} catch (Exception e) {

e.printStackTrace();

return;

}

步骤3 对请求进行签名、访问API并打印结果:

样例代码如下:

CloseableHttpClient client = null;

try {

HttpRequestBase signedRequest = Client.sign(request);

client = HttpClients.custom().build();

HttpResponse response = client.execute(signedRequest);

System.out.println(response.getStatusLine().toString());

Header[] resHeaders = response.getAllHeaders();

for (Header h : resHeaders) {

System.out.println(h.getName() + ":" + h.getValue());

}

HttpEntity resEntity = response.getEntity();

if (resEntity != null)

(23)

{

if (client != null) {

client.close();

}

} catch (IOException e) {

e.printStackTrace();

} }

步骤4 选择“Main.java”,单击鼠标右键,选择“Run As > Java Application”,运行工程 测试代码。

3-15 运行工程测试代码

步骤5 在“Console”页签,查看运行结果。

(24)

3-16 调用成功后的返回信息

----结束

3.4 Go

操作场景

使用Go语言调用APP认证的API时,您需要先获取SDK,然后新建工程,最后参考调用 API示例调用API。

本章节以IntelliJ IDEA 2018.3.5版本为例介绍。

前提条件

● 已获取API的域名、请求url、请求方法、AppKey和AppSecret等信息,具体参见认 证前准备。

● 获取并安装Go安装包,如果未安装,请至Go官方下载页面下载。

● 获取并安装IntelliJ IDEA,如果未安装,请至IntelliJ IDEA官方网站下载。

● 已在IntelliJ IDEA中安装Go插件,如果未安装,请按照图3-17所示安装。

(25)

3-17 安装 Go 插件

获取 SDK

请登录API网关控制台,参考《用户指南》的“SDK”章节,进入SDK页面并下载 SDK。

或直接下载SDK的最新版本,获取“ApiGateway-go-sdk.zip”压缩包,解压后目录结 构如下:

名称 说明

core\escape.go SDK代码 core\signer.go

demo.go 示例代码

新建工程

步骤1 打开IntelliJ IDEA,选择菜单“File > New > Project”。

弹出“New Project”对话框,选择“Go”,单击“Next”。

(26)

3-18 Go

步骤2 单击“...”,在弹出的对话框中选择解压后的SDK路径,单击“Finish”。

(27)

3-19 选择解压后 go 的 SDK 路径

步骤3 完成工程创建后,目录结构如下。

3-20 新建工程 go 的目录结构

“demo.go”为示例代码,请根据实际情况修改参数后使用。具体代码说明请参考调 用API示例。

----结束

调用 API 示例

步骤1 在工程中引入sdk(signer.go)。

import "apig-sdk/go/core"

(28)

步骤2 生成一个新的Signer,输入AppKey和AppSecret。

s := core.Signer{

Key: "4f5f626b-073f-402f-a1e0-e52171c6100c", Secret: "******",

}

步骤3 生成一个新的Request,指定域名、方法名、请求url、query和body。

r, _ := http.NewRequest("POST", "http://c967a237-cd6c-470e-906f- a8655461897e.apigw.exampleRegion.com/api?a=1&b=2",

ioutil.NopCloser(bytes.NewBuffer([]byte("foo=bar"))))

步骤4 给请求添加x-stage头,内容为环境名。如有需要,添加需要签名的其他头域。

r.Header.Add("x-stage", "RELEASE")

步骤5 进行签名,执行此函数会在请求中添加用于签名的X-Sdk-Date头和Authorization头。

s.Sign(r)

步骤6 访问API,查看访问结果。

resp, err := http.DefaultClient.Do(r) body, err := ioutil.ReadAll(resp.Body)

----结束

3.5 Python

操作场景

使用Python语言调用APP认证的API时,您需要先获取SDK,然后新建工程,最后参考 调用API示例调用API。

本章节以IntelliJ IDEA 2018.3.5版本为例介绍。

准备环境

● 已获取API的域名、请求url、请求方法、AppKey和AppSecret等信息,具体参见认 证前准备。

● 获取并安装Python安装包(可使用2.7.9+或3.X),如果未安装,请至Python官方 下载页面下载。

Python安装完成后,在cmd/shell窗口中使用pip安装“requests”库。

pip install requests 说明

如果pip安装requests遇到证书错误,请下载并使用Python执行此文件,升级pip,然后再 执行以上命令安装。

● 获取并安装IntelliJ IDEA,如果未安装,请至IntelliJ IDEA官方网站下载。

● 已在IntelliJ IDEA中安装Python插件,如果未安装,请按照图3-21所示安装。

(29)

3-21 安装 Python 插件

获取 SDK

请登录API网关控制台,参考《用户指南》的“SDK”章节,进入SDK页面并下载 SDK。

或直接下载SDK的最新版本,获取“ApiGateway-python-sdk.zip”压缩包,解压后目 录结构如下:

名称 说明

apig_sdk\__init__.py SDK代码 apig_sdk\signer.py

main.py 示例代码

backend_signature.py 后端签名示例代码 licenses\license-requests 第三方库license文件

新建工程

步骤1 打开IDEA,选择菜单“File > New > Project”。

弹出“New Project”对话框,选择“Python”,单击“Next”。

(30)

3-22 Python

步骤2 再次单击“Next”,弹出以下对话框。单击“...”,在弹出的对话框中选择解压后的 SDK路径,单击“Finish”。

3-23 选择解压后的 SDK 路径

(31)

步骤3 完成工程创建后,目录结构如下。

3-24 新建工程 python 的目录结构

“main.py”为示例代码,请根据实际情况修改参数后使用。具体代码说明请参考调用

API示例。

----结束

调用 API 示例

步骤1 在工程中引入apig_sdk。

from apig_sdk import signer import requests

步骤2 生成一个新的Signer,填入AppKey和AppSecret。

sig = signer.Signer()

sig.Key = "4f5f626b-073f-402f-a1e0-e52171c6100c"

sig.Secret = "******"

步骤3 生成一个Request对象,指定方法名、请求uri、header和body。

r = signer.HttpRequest("POST",

"https://c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com/app1?a=1", {"x-stage": "RELEASE"},

"body")

步骤4 进行签名,执行此函数会在请求参数中添加用于签名的X-Sdk-Date头和Authorization 头。

说明

X-Sdk-Date是一个必须参与签名的请求消息头参数。

sig.Sign(r)

步骤5 访问API,查看访问结果。

resp = requests.request(r.method, r.scheme + "://" + r.host + r.uri, headers=r.headers, data=r.body) print(resp.status_code, resp.reason)

print(resp.content)

----结束

(32)

3.6 C#

操作场景

使用C#语言调用APP认证的API时,您需要先获取SDK,然后打开SDK包中的工程文 件,最后参考API调用示例调用API。

准备环境

● 已获取API的域名、请求url、请求方法、AppKey和AppSecret等信息,具体参见认 证前准备。

● 获取并安装Visual Studio,如果未安装,请至Visual Studio官方网站下载。

获取 SDK

请登录API网关控制台,参考《用户指南》的“SDK”章节,进入SDK页面并下载 SDK。

或直接下载SDK的最新版本,获取“ApiGateway-csharp-sdk.zip”压缩包,解压后目 录结构如下:

名称 说明

apigateway-signature

\Signer.cs SDK代码 apigateway-signature

\HttpEncoder.cs

sdk-request\Program.cs 签名请求示例代码 backend-signature\ 后端签名示例工程 csharp.sln 工程文件

licenses\license-

referencesource 第三方库license文件

打开工程

双击SDK包中的“csharp.sln”文件,打开工程。工程中包含如下3个项目:

(33)

调用 API 示例

步骤1 在工程中引入sdk。

using APIGATEWAY_SDK;

步骤2 生成一个新的Signer, 填入AppKey和AppSecret。

Signer signer = new Signer();

signer.Key = "4f5f626b-073f-402f-a1e0-e52171c6100c";

signer.Secret = "******";

步骤3 生成一个HttpRequest对象,指定域方法名、请求url和body。

HttpRequest r = new HttpRequest("POST",

new Uri("https://c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com/app1?

query=value"));

r.body = "{\"a\":1}";

步骤4 给请求添加x-stage头,内容为环境名。如有需要,添加需要签名的其他头域。

r.headers.Add("x-stage", "RELEASE");

步骤5 进行签名,执行此函数会生成一个新的HttpWebRequest,并在请求参数中添加用于签 名的X-Sdk-Date头和Authorization头。

HttpWebRequest req = signer.Sign(r);

步骤6 访问API,查看访问结果。

var writer = new StreamWriter(req.GetRequestStream());

writer.Write(r.body);

writer.Flush();

HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

var reader = newStreamReader(resp.GetResponseStream());

Console.WriteLine(reader.ReadToEnd());

----结束

3.7 JavaScript

操作场景

使用JavaScript语言调用APP认证的API时,您需要先获取SDK,然后新建工程,最后参 考API调用示例调用API。

JavaScript SDK支持Node.js、浏览器、微信小程序等运行环境。

关于开发环境搭建,本章节以IntelliJ IDEA 2018.3.5版本、搭建Node.js环境为例。浏 览器与微信小程序等,只提供代码示例说明。

准备环境

● 已获取API的域名、请求url、请求方法、AppKey和AppSecret等信息,具体参见认 证前准备。

● 获取并安装Nodejs安装包,如果未安装,请至Nodejs官方下载页面下载。

● 获取并安装IntelliJ IDEA,如果未安装,请至IntelliJ IDEA官方网站下载。

● 已在IntelliJ IDEA中安装NodeJS插件,如果未安装,请按照图3-25所示安装。

(34)

3-25 安装 NodeJS 插件

获取 SDK

请登录API网关控制台,参考《用户指南》的“SDK”章节,进入SDK页面并下载 SDK。

或直接下载SDK的最新版本,获取“ApiGateway-javascript-sdk.zip”压缩包,解压后 目录结构如下:

名称 说明

signer.js SDK代码

node_demo.js Nodejs示例代码 demo.html 浏览器示例代码

demo_require.html 浏览器示例代码(使用require加载)

test.js 测试用例

js\hmac-sha256.js 依赖库

licenses\license-crypto-js 第三方库license文件 licenses\license-node

(35)

3-26 Static Web

步骤2 单击“...”,在弹出的对话框中选择解压后的SDK路径,单击“Finish”。

3-27 选择解压后 JavaScript 的 SDK 路径

步骤3 完成工程创建后,目录结构如下。

(36)

3-28 新建工程 JavaScript 的目录结构

● node_demo.js:Nodejs示例代码,请根据实际情况修改参数后使用。具体代码说 明请参考调用API(Node.js)示例。

● demo.html:浏览器示例代码,请根据实际情况修改参数后使用。具体代码说明 请参考调用API(浏览器)示例。

步骤4 单击“Edit Configurations”,弹出“Run/Debug Configurations”对话框。

3-29 Click Edit Configurations

步骤5 单击“+”,选择“Node.js”。

(37)

3-30 选择 Node.js

步骤6 “JavaScript file”选择“node_demo.js”,单击“OK”,完成配置。

3-31 选择 node_demo.js

----结束

调用 API(Node.js)示例

步骤1 在工程中引入signer.js。

var signer = require('./signer') var http = require('http')

步骤2 生成一个新的Signer,填入AppKey和AppSecret。

var sig = new signer.Signer()

sig.Key = "4f5f626b-073f-402f-a1e0-e52171c6100c"

sig.Secret = "******"

步骤3 生成一个Request对象,指定方法名、请求uri和body。

(38)

var r = new signer.HttpRequest("POST", "c967a237-cd6c-470e-906f- a8655461897e.apigw.exampleRegion.com/app1?a=1");

r.body = '{"a":1}'

步骤4 给请求添加x-stage头,内容为环境名。如有需要,添加需要签名的其他头域。

r.headers = { "x-stage":"RELEASE" }

步骤5 进行签名,执行此函数会生成请求参数,用于创建http(s)请求,请求参数中添加了用 于签名的X-Sdk-Date头和Authorization头。

var opt = sig.Sign(r)

步骤6 访问API,查看访问结果。如果使用https访问,则将“http.request”改为

“https.request”。

var req=http.request(opt, function(res){

console.log(res.statusCode) res.on("data", function(chunk){

console.log(chunk.toString()) })

})req.on("error",function(err){

console.log(err.message) })req.write(r.body)

req.end()

----结束

调用 API(浏览器)示例

使用浏览器访问API,需要注册支持OPTIONS方法的API,具体步骤请参见创建

OPTIONS方式的API,且返回头中带有“Access-Control-Allow-*”相关访问控制头

域,可在创建API时通过开启CORS来添加这些头域。

步骤1 在html中引入signer.js及依赖。

<script src="js/hmac-sha256.js"></script>

<script src="js/moment.min.js"></script>

<script src="js/moment-timezone-with-data.min.js"></script>

<script src='signer.js'></script>

步骤2 进行签名和访问。

var sig = new signer.Signer()

sig.Key = "4f5f626b-073f-402f-a1e0-e52171c6100c"

sig.Secret = "******"

var r= new signer.HttpRequest()

r.host = "c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com"

r.method = "POST"

r.uri = "/app1"

r.body = '{"a":1}'

r.query = { "a":"1","b":"2" }

r.headers = { "Content-Type":"application/json" } var opt = sig.Sign(r)

var scheme = "https"

$.ajax({

type: opts.method, data: req.body,

(39)

$('#recv').html(resp.responseText) } else {

$('#status').html(resp.state()) }

},

timeout: 1000 });

----结束

调用 API(微信小程序)示例

步骤1 下载微信小程序示例工程。

步骤2 下载微信开发者工具,使用开发工具打开示例工程,如下图所示。

步骤3 示例工程中详细说明了微信小程序中签名的使用方法,下面是其中的关键代码。

var req = new signer.HttpRequest("POST", "https://30030113-3657-4fb6- a7ef-90764239b038.apigw.exampleRegion.com/app1?a=1", {}, "body") var sig = new signer.Signer();

sig.Key = "071fe245-9cf6-4d75-822d-c29945a1e06a"

sig.Secret = "******"

var opts = sig.Sign(req);

wx.request({

url: "https://" + opts.hostname + opts.path, data: req.body,

header: opts.headers, method: opts.method, success: function (res) { console.log(res) }

})

----结束

(40)

3.8 PHP

操作场景

使用PHP语言调用APP认证的API时,您需要先获取SDK,然后新建工程,最后参考API 调用示例调用API。

本章节以IntelliJ IDEA 2018.3.5版本为例介绍。

准备环境

● 已获取API的域名、请求url、请求方法、AppKey和AppSecret等信息,具体参见认 证前准备。

● 获取并安装IntelliJ IDEA,如果未安装,请至IntelliJ IDEA官方网站下载。

● 获取并安装PHP安装包,如果未安装,请至PHP官方下载页面下载。

● 将PHP安装目录中的“php.ini-production”文件复制到“C:\windows”,改名为

“php.ini”,并在文件中增加如下内容。

extension_dir = "php安装目录/ext"

extension=openssl extension=curl

● 已在IntelliJ IDEA中安装PHP插件,如果未安装,请按照图3-32所示安装。

3-32 安装 PHP 插件

(41)

名称 说明 signer.php SDK代码

index.php 示例代码

新建工程

步骤1 打开IDEA,选择菜单“File > New > Project”。

弹出“New Project”对话框,选择“PHP”,单击“Next”。

3-33 PHP

步骤2 单击“...”,在弹出的对话框中选择解压后的SDK路径,单击“Finish”。

(42)

3-34 选择解压后 php 的 SDK 路径

步骤3 完成工程创建后,目录结构如下。

3-35 新建工程 php 的目录结构

“signer.php”为示例代码,请根据实际情况修改参数后使用。具体代码说明请参考调 用API示例。

----结束

调用 API 示例

(43)

步骤3 生成一个新的Request,指定方法名、请求url和body(body根据实际的接口请求指 定)。

$req = new Request('GET', "https://c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com/

app1?a=1");

$req->body = '';

步骤4 给请求添加x-stage头,内容为环境名。如果有需要,添加需要签名的其他头域。

$req->headers = array(

'x-stage' => 'RELEASE', );

步骤5 进行签名,执行此函数会生成一个$curl上下文变量。

$curl = $signer->Sign($req);

步骤6 访问API,查看访问结果。

$response = curl_exec($curl);

echo curl_getinfo($curl, CURLINFO_HTTP_CODE);

echo $response;

curl_close($curl);

----结束

3.9 C++

操作场景

使用C++语言调用APP认证的API时,您需要先获取SDK,参考API调用示例调用API。

准备环境

1. 已获取API的域名、请求url、请求方法、AppKey和AppSecret等信息,具体参见认 证前准备。

2. 安装openssl库。

apt-get install libssl-dev

3. 安装curl库。

apt-get install libcurl4-openssl-dev

获取 SDK

请登录API网关控制台,参考《用户指南》的“SDK”章节,进入SDK页面并下载 SDK。

或直接下载SDK的最新版本,获取“ApiGateway-cpp-sdk.zip”压缩包,解压后目录 结构如下:

名称 说明

hasher.cpp SDK代码 hasher.h

header.h

RequestParams.cpp RequestParams.h

(44)

名称 说明 signer.cpp

signer.h

Makefile Makefile文件

main.cpp 示例代码

调用 API 示例

步骤1 在main.cpp中加入以下引用。

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <curl/curl.h>

#include "signer.h"

步骤2 生成一个新的Signer, 填入AppKey和AppSecret。

Signer signer("4f5f626b-073f-402f-a1e0-e52171c6100c", "******");

步骤3 生成一个新的RequestParams,指定方法名、域名、请求uri、查询字符串和body。

RequestParams* request = new RequestParams("POST", "c967a237-cd6c-470e-906f- a8655461897e.apigw.exampleRegion.com", "/app1",

"Action=ListUsers&Version=2010-05-08", "demo");

步骤4 给请求添加x-stage头,内容为环境名。如果有需要,添加需要签名的其他头域。

request->addHeader("x-stage", "RELEASE");

步骤5 进行签名,执行此函数会将生成的签名头加入request变量中。

signer.createSignature(request);

步骤6 使用curl库访问API,查看访问结果。

static size_t

WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) { size_t realsize = size * nmemb;

struct MemoryStruct *mem = (struct MemoryStruct *)userp;

mem->memory = (char*)realloc(mem->memory, mem->size + realsize + 1);

if (mem->memory == NULL) { /* out of memory! */

printf("not enough memory (realloc returned NULL)\n");

return 0;

}

memcpy(&(mem->memory[mem->size]), contents, realsize);

mem->size += realsize;

mem->memory[mem->size] = 0;

return realsize;

(45)

struct MemoryStruct resp_body;

resp_body.memory = (char*)malloc(1);

resp_body.size = 0;

curl_global_init(CURL_GLOBAL_ALL);

curl = curl_easy_init();

curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, request->getMethod().c_str());

std::string url = "http://" + request->getHost() + request->getUri() + "?" + request->getQueryParams();

curl_easy_setopt(curl, CURLOPT_URL, url.c_str());

struct curl_slist *chunk = NULL;

std::set<Header>::iterator it;

for (auto header : *request->getHeaders()) {

std::string headerEntry = header.getKey() + ": " + header.getValue();

printf("%s\n", headerEntry.c_str());

chunk = curl_slist_append(chunk, headerEntry.c_str());

}

printf("---\n");

curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);

curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, request->getPayload().c_str());

curl_easy_setopt(curl, CURLOPT_NOBODY, 0L);

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);

curl_easy_setopt(curl, CURLOPT_HEADERDATA, (void *)&resp_header);

curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&resp_body);

//curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

res = curl_easy_perform(curl);

if (res != CURLE_OK) {

fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));

} else { long status;

curl_easy_getinfo(curl, CURLINFO_HTTP_CODE, &status);

printf("status %d\n", status);

printf(resp_header.memory);

printf(resp_body.memory);

}

free(resp_header.memory);

free(resp_body.memory);

curl_easy_cleanup(curl);

curl_global_cleanup();

return 0;

}

步骤7 运行make命令编译,得到可执行文件main,执行main文件,查看结果。

----结束

3.10 C

操作场景

使用C语言调用APP认证的API时,您需要先获取SDK,参考API调用示例调用API。

准备环境

1. 已获取API的域名、请求url、请求方法、AppKey和AppSecret等信息,具体参见认 证前准备。

2. 安装openssl库。

apt-get install libssl-dev

3. 安装curl库。

apt-get install libcurl4-openssl-dev

(46)

获取 SDK

请登录API网关控制台,参考《用户指南》的“SDK”章节,进入SDK页面并下载 SDK。

或直接下载SDK的最新版本,获取“ApiGateway-c-sdk.zip”压缩包,解压后目录结构 如下:

名称 说明

signer_common.c SDK代码 signer_common.h

signer.c signer.h

Makefile Makefile文件

main.c 示例代码

调用 API 示例

步骤1 在main.c中加入以下引用。

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <curl/curl.h>

#include "signer.h"

步骤2 生成一个sig_params_t类型的变量, 填入AppKey和AppSecret。

sig_params_t params;

sig_params_init(&params);

sig_str_t app_key = sig_str("4f5f626b-073f-402f-a1e0-e52171c6100c");

sig_str_t app_secret = sig_str("******");

params.key = app_key;

params.secret = app_secret;

步骤3 指定方法名、域名、请求uri、查询字符串和body。

sig_str_t host = sig_str("c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com");

sig_str_t method = sig_str("GET");

sig_str_t uri = sig_str("/app1");

sig_str_t query_str = sig_str("a=1&b=2");

sig_str_t payload = sig_str("");

params.host = host;

params.method = method;

params.uri = uri;

params.query_str = query_str;

params.payload = payload;

(47)

{ size_t realsize = size * nmemb;

struct MemoryStruct *mem = (struct MemoryStruct *)userp;

mem->memory = (char*)realloc(mem->memory, mem->size + realsize + 1);

if (mem->memory == NULL) { /* out of memory! */

printf("not enough memory (realloc returned NULL)\n");

return 0;

}

memcpy(&(mem->memory[mem->size]), contents, realsize);

mem->size += realsize;

mem->memory[mem->size] = 0;

return realsize;

}

//send http request using curl library int perform_request(RequestParams* request) { CURL *curl;

CURLcode res;

struct MemoryStruct resp_header;

resp_header.memory = malloc(1);

resp_header.size = 0;

struct MemoryStruct resp_body;

resp_body.memory = malloc(1);

resp_body.size = 0;

curl_global_init(CURL_GLOBAL_ALL);

curl = curl_easy_init();

curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, params.method.data);

char url[1024];

sig_snprintf(url, 1024, "http://%V%V?%V", &params.host, &params.uri, &params.query_str);

curl_easy_setopt(curl, CURLOPT_URL, url);

struct curl_slist *chunk = NULL;

for (int i = 0; i < params.headers.len; i++) { char header[1024];

sig_snprintf(header, 1024, "%V: %V", &params.headers.data[i].name, &params.headers.data[i].value);

printf("%s\n", header);

chunk = curl_slist_append(chunk, header);

}

printf("---\n");

curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);

curl_easy_setopt(curl, CURLOPT_POSTFIELDS, params.payload.data);

curl_easy_setopt(curl, CURLOPT_NOBODY, 0L);

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);

curl_easy_setopt(curl, CURLOPT_HEADERDATA, (void *)&resp_header);

curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&resp_body);

//curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

res = curl_easy_perform(curl);

if (res != CURLE_OK) {

fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));

} else { long status;

curl_easy_getinfo(curl, CURLINFO_HTTP_CODE, &status);

printf("status %d\n", status);

printf(resp_header.memory);

printf(resp_body.memory);

}

free(resp_header.memory);

free(resp_body.memory);

curl_easy_cleanup(curl);

curl_global_cleanup();

(48)

//free signature params sig_params_free(&params);

return 0;

}

步骤7 运行make命令编译,得到可执行文件main,执行main文件,查看结果。

----结束

3.11 Android

操作场景

使用Android语言调用APP认证的API时,您需要先获取SDK,然后新建工程,最后参考 API调用示例调用API。

准备环境

● 已获取API的域名、请求url、请求方法、AppKey和AppSecret等信息,具体参见认 证前准备。

● 获取并安装Android Studio,如果未安装,请至Android Studio官方网站下载。

获取 SDK

请登录API网关控制台,参考《用户指南》的“SDK”章节,进入SDK页面并下载 SDK。

或直接下载SDK的最新版本,获取“ApiGateway-android-sdk.zip”压缩包,解压后目 录结构如下:

名称 说明

app\ 安卓工程代码

gradle\ gradle相关文件 build.gradle gradle配置文件 gradle.properties

settings.gradle

gradlew gradle wrapper执行脚本 gradlew.bat

(49)

3-36 工程目录结构

----结束

调用 API 示例

步骤1 在Android工程中的“app/libs”目录下,加入SDK所需jar包。其中jar包必须包括:

● java-sdk-core-x.x.x.jar

● joda-time-2.10.jar

步骤2 在“build.gradle”文件中加入okhttp库的依赖。

在“build.gradle”文件中的“dependencies”下加入“implementation 'com.squareup.okhttp3:okhttp:3.14.2'”。

dependencies { ...

...

implementation 'com.squareup.okhttp3:okhttp:3.14.3' }

步骤3 创建request,输入AppKey和AppSecret,并指定域名、方法名、请求uri和body。

Request request = new Request();

try {

request.setKey("4f5f626b-073f-402f-a1e0-e52171c6100c");

request.setSecrect("******");

request.setMethod("POST");

request.setUrl("https://c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com/app1");

request.addQueryStringParam("name", "value");

(50)

request.addHeader("Content-Type", "text/plain");

request.setBody("demo");

} catch (Exception e) { e.printStackTrace();

return;

}

步骤4 对请求进行签名,生成okhttp3.Request对象来访问API。

okhttp3.Request signedRequest = Client.signOkhttp(request);

OkHttpClient client = new OkHttpClient.Builder().build();

Response response = client.newCall(signedRequest).execute();

----结束

3.12 curl

操作场景

使用curl命令调用APP认证的API时,您需要先下载JavaScript SDK生成curl命令,然后 将curl命令复制到命令行调用API。

前提条件

已获取API的域名、请求url、请求方法、AppKey和AppSecret等信息,具体参见认证前 准备。

调用 API 示例

步骤1 使用JavaScript SDK生成curl命令。

请登录API网关控制台,从左侧导航选择“调用API > SDK”进入下载页面下载。

或直接下载JavaScript SDK的最新版本,并解压。在浏览器中打开demo.html,页面 如下图所示。

(51)

步骤2 填入Key、Secret、方法名、请求协议、域名和url。例如:

Key=4f5f626b-073f-402f-a1e0-e52171c6100c Secret=******

Method=POST

Url=https://c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com

步骤3 填入json格式的Query和Headers,填入Body。

步骤4 单击“Send request”,生成curl命令。将curl命令复制到命令行,访问API。

$ curl -X POST "https://c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com/" -H "X-Sdk- Date: 20180530T115847Z" -H "Authorization: SDK-HMAC-SHA256 Access=071fe245-9cf6-4d75-822d- c29945a1e06a, SignedHeaders=host;x-sdk-date, Signature=9e5314bd156d517******dd3e5765fdde4" -d ""

Congratulations, sdk demo is running 说明

SDK生成的curl命令不符合Window下cmd终端格式,请在git bash下执行生成的curl命令。

----结束

(52)

4 使用 IAM 认证调用 API

4.1 Token 认证

操作场景

当您使用Token认证方式调用API时,需要获取用户Token并在调用API时将Token值设 置到调用请求的“X-Auth-Token”头域中。

说明

调用接口有如下两种认证方式,您可以选择其中一种进行认证鉴权。

● Token认证:通过Token认证通用请求。

● AK/SK认证:通过AK(Access Key ID)/SK(Secret Access Key)对调用请求内容进行签名 认证。

调用接口步骤

1. 获取Token,请参考《统一身份认证服务API参考》的“获取用户Token”章节。

请求响应成功后在响应消息头中包含的“X-Subject-Token”的值即为Token值。

以下示例为使用接口测试工具手工获取Token方案。

(53)

4-1 请求示例

4-2 从返回消息的 Header 中获取 X-Subject-Token

2. 调用业务接口,在请求消息头中增加“X-Auth-Token”,“X-Auth-Token”的取 值为1中获取的Token。

接口调用示例

本小节介绍使用API的基本流程。

1. 获取相关信息。

已获取IAM的Endpoint,具体请参见地区和终端节点。

2. 在管理控制台,将鼠标移至用户名,在下拉列表中单击“我的凭证”,查看“项 目ID”。

(54)

3. 获取用户Token,并设置成环境变量,Token用于后续调用其他接口鉴权。

a. 执行以下命令,获取用户Token。

curl -X POST https://{iam_endpoint}/v3/auth/tokens -H 'content-type: application/json' -d '{

"auth": { "identity": { "methods": [ "password"

],

"password": { "user": {

"name": "{user_name}", "domain": {

"name": "{user_name}"

},

"password": "{password}"

} } }, "scope": { "project": {

"id": "{project_id}"

} } } }' -vk

上述命令中,部分参数请参见以下说明进行修改(具体请参考《统一身份认 证服务API参考》):

{iam_endpoint}

替换为前提条件中获取的IAM的Endpoint。

{project_id}

替换为前提条件中获取的项目ID。

{

user_name}

和{

password}

分别替换为连接IAM服务器的用户名和密 码。

响应Header中“X-Subject-Token”的值即为Token:

X-Subject-Token:MIIDkgYJKoZIhvcNAQcCoIIDgzCCAxxxxxx38CAQExDTALBglghkgBZQMEAgEwg

b. 使用如下命令将token设置为环境变量,方便后续事项。

export Token=

{X-Subject-Token}

X-Subject-Token即为3.a获取到的token,命令示例如下。

export Token=MIIDkgYJKoZIhvcNAQcCoIIDgzCCAxxxxxx38CAQExDTALBglghkgBZQMEAgEwg

4. 调用API,请参考认证前准备获取域名、请求方法和URL。参数请根据实际情况填 写。curl -X 请求方法 域名+URL -H "x-auth-token: $Token" -vk

4.2 AK/SK 认证

使用AK(Access Key ID)、SK(Secret Access Key)对请求进行签名。

(55)

生成 AK、SK

如果已生成过AK/SK,则可跳过此步骤,找到原来已下载的AK/SK文件,文件名一般 为:credentials.csv。

如下图所示,文件包含了租户名(User Name),AK(Access Key Id),SK(Secret Access Key)。

4-3 credential.csv 文件内容

AK/SK生成步骤:

1. 注册并登录管理控制台。

2. 将鼠标移至用户名,在下拉列表中单击“我的凭证”。

3. 单击“访问密钥”。

4. 单击“新增访问密钥”,进入“新增访问密钥”页面。

5. 按照界面提示输入验证码或登录密码,单击“确定”,下载密钥,请妥善保管。

生成签名

生成签名的方式和APP认证相同,用AK代替APP认证中的AppKey,SK替换APP认证中 的AppSecret,即可完成签名和请求。您可使用Java、Go、Python、C#、

JavaScript、PHP、C++、C、Android进行签名和访问。

须知

客户端须注意本地时间与时钟服务器的同步,避免请求消息头X-Sdk-Date的值出现较 大误差。

API网关(即API管理)除了校验时间格式外,还会校验该时间值与网关收到请求的时 间差,如果时间差超过15分钟,API网关将拒绝请求。

(56)

5 创建用于前端自定义认证的函数

操作场景

自定义认证包括前端自定义认证与后端自定义认证,前端自定义认证指APIG利用校验 函数对收到的API请求进行安全认证,后端自定义认证指API后端服务利用校验函数,

对来自APIG转发的API请求进行安全认证。

如果您想要使用自己的认证系统对API的访问进行认证鉴权,您可以在API管理中创建 一个前端自定义认证来实现此功能。在使用前端自定义认证对前端请求进行认证鉴权 前,您需要先在FunctionGraph创建一个函数,通过函数定义您所需的认证信息。函数 创建完后,作为自定义认证的后端函数,对API网关中的API进行认证鉴权。

本章节介绍如何将校验函数封装成一个“自定义认证”,以及封装成自定义认证过程 中的操作注意事项。

5-1 前端自定义认证示意图

使用自定义认证调用API的流程如下图所示:

(57)

5-2 自定义认证调用 API

说明

自定义认证依赖函数服务。如果当前Region没有上线函数服务,则不支持使用自定义认证。

操作步骤

步骤1 在FunctionGraph中开发函数。

下面以python2.7语言为例,函数代码需要满足如下条件:

● 函数代码支持三种请求参数定义,格式为:

– Header中的请求参数:event["headers"]["参数名"]

– Query中的请求参数:event["queryStringParameters"]["参数名"]

– 您自定义的用户数据:event["user_data"]

● 函数代码获取的三种请求参数与API网关自定义认证中的参数关系如下所示:

– Header中的请求参数:对应自定义认证中参数位置为Header的身份来源,其 参数值在您调用使用该前端自定义认证的API时传入

– Query中的请求参数:对应自定义认证中参数位置为Query的身份来源,其参 数值在您调用使用该前端自定义认证的API时传入

– 您自定义的用户数据:对应自定义认证中的用户数据,其参数值在您创建自 定义认证时输入

● 函数的返回值不能大于1M,必须满足如下格式:

{ "statusCode":200,

"body": "{\"status\": \"allow\", \"context\": {\"user\": \"abc\"}}"

}

其中,body字段的内容为字符串格式,json解码之后为:

(58)

{ "status": "allow/deny", "context": {

"user": "abc"

} }

“status”字段为必选,用于标识认证结果。只支持“allow”或“deny”,

“allow”表示认证成功,“deny”表示认证失败。

“context”字段为可选,只支持字符串类型键值对,键值不支持JSON对象或数 组。

context中的数据为您自定义的字段,认证通过后作为认证参数映射到API网关后 端参数中,其中context中的参数名称与系统参数名称必须完全一致,且区分大小 写,context中的参数名称必须以英文字母开头,支持英文大小写字母、数字、下 划线和中划线,且长度为1 ~ 32个字符。如图5-3所示,前端认证通过后,

context中的user的值abc映射到后端服务Header位置的test参数中。

5-3 将认证参数映射到后端参数

Header中的请求参数定义代码示例:

# -*- coding:utf-8 -*- import json

def handler(event, context):

if event["headers"].get("test")=='abc':

resp = {

'statusCode': 200, 'body': json.dumps({

"status":"allow", "context":{

"user":"abcd"

} }) } else:

resp = {

'statusCode': 200,

(59)

def handler(event, context):

if event["queryStringParameters"].get("test")=='abc':

resp = {

'statusCode': 200, 'body': json.dumps({

"status":"allow", "context":{

"user":"abcd"

} }) } else:

resp = {

'statusCode': 200, 'body': json.dumps({

"status":"deny", })

}

return json.dumps(resp)

用户数据定义代码示例:

# -*- coding:utf-8 -*- import json

def handler(event, context):

if event.get("user_data")=='abc':

resp = {

'statusCode': 200, 'body': json.dumps({

"status":"allow", "context":{

"user":"abcd"

} }) } else:

resp = {

'statusCode': 200, 'body': json.dumps({

"status":"deny", })

}

return json.dumps(resp)

步骤2 测试函数。在测试事件的“事件模板”中选择“apig-event-template”,根据实际情 况修改后保存测试模板,单击“测试”。

执行结果为“成功”时,表示测试成功。

接下来您需要进入API网关界面创建前端自定义认证。

(60)

5-4 测试函数

----结束

后续操作

在自定义认证中已经创建完成用于前端自定义认证的Function API,下一步您需要进入 API网关中创建前端自定义认证。

(61)

6 创建用于后端自定义认证的函数

操作场景

如果您需要使用一种认证机制对接多个不同的外部认证系统,实现对于后端服务的保 护,您可以通过API网关中的后端自定义认证实现此功能。在使用后端自定义认证对后 端请求进行认证授权前,您需要先在FunctionGraph创建一个函数,通过函数定义您所 需的认证信息。函数作为自定义认证的后端函数,对API网关中的API进行认证授权。

6-1 后端自定义认证示意图

使用自定义认证调用API的流程如下图所示:

(62)

6-2 使用自定义认证调用 API

说明

自定义认证依赖函数服务。如果当前Region没有上线函数服务,则不支持使用自定义认证。

操作步骤

步骤1 在FunctionGraph中开发函数。

下面以python2.7为例,函数代码需要满足如下条件:

● 函数代码只支持您自定义的用户数据,且它的格式为:event["user_data"]。

● 函数代码获取的请求参数与API网关自定义认证中的参数关系为:函数请求参数中 的自定义用户数据对应API网关自定义认证中的用户数据,参数值在您创建API网 关自定义认证时输入,用户数据格式不限制,您可以自行指定。

● 函数的返回值不能大于1M,必须满足如下格式:

{ "statusCode":200,

"body": "{\"status\": \"allow\", \"context\": {\"user\": \"abc\"}}"

}

其中,body字段的内容为字符串格式,json解码之后为:

數據

表 8-5 参数说明 参数 是否 必选 类型 说明 type 是 String  后端服务类型,支持HTTP、HTTP-VPC、FUNCTION、MOCK parameters 否  x- apigateway-backend.para meters 后端参数定义 httpEndpoints 否  x- apigateway-backend.http Endpoints HTTP类型后端服务定义 httpVpcEndpo ints 否  x- apigateway-backend.http VpcEndpo

參考文獻

相關文件

 Request.Cookies[ &#34;Cookie 名稱&#34; ].Value –取得使用者所傳送的 Cookie 內容. 

share how these companies &#34;help&#34; their how these companies &#34;help&#34; their lives / help raising people's living. lives / help raising people's living

&#34;internet Access by Mobile in a Smart

[r]

浩南挑了一張班遊的照片,想自行加工美化送給老師。他將長 14 公 分、寬 12 公分的照片周圍貼上等寬的花邊膠帶。若裝飾後中間剩下 的照片區塊面積為 80 平方公分,試問花邊膠帶的寬度為

(2004), &#34;Waiting Strategies for the Dynamic Pickup and Delivery Problem with Time Window&#34;, Transportation Research Part B, Vol. Odoni (1995),&#34;Stochastic and Dynamic

A clever and simplifying strategy: pairing up all the rays coming through the slit and then finding what conditions cause the waves of the rays in each pair to cancel each other.

[r]