网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl
网关控制台: https://apigateway.console.aliyun.com/?spm=5176.doc42740.2.2.Q4z5ws#/cn-hangzhou/apis/list
使用二级域名访问我开放的api
一、创建api分组
API 分组是 API 的管理单元,先创建 API 分组,然后在分组下创建 API。
分组有 Region 属性,API 选定分组就选定了 Region,不可更改。
分组创建时,会绑定一个唯一的二级域名,您可以访问该二级域名调用该分组下测试中的 API。
若要开放 API 服务,您需要为分组绑定独立域名,独立域名需要在阿里云系统备案并且 CNAME 到该分组的二级域名上,用户访问独立域名时会调用该分组下线上的 API。
如果您的 API 支持 HTTPS 协议,您还需要为该独立域名上传 SSL 证书。
二、绑定域名和证书
域名是绑定在 API 分组上面的,API 网关通过域名来定位到一个唯一的 API 分组,再通过Path+HTTPMethod 确定唯一的 API。
如果您需要开放 API 则需要为分组绑定独立域名。独立域名需要满足以下几点:
- 独立域名需要在 阿里云备案 或者在 阿里云备案接入。
- 独立域名要 CNAME 解析到该分组的二级域名上,然后操作绑定。先解析,后绑定,否则绑定操作会报错。
- 若您需要将其他分组的独立域名变更到当前分组,需要先变更解析,才能成功绑定。
若该分组下的 API 支持 HTTPS 协议,您还需要为该独立域名上 SSL 证书。不支持文件上传,需要填写证书名称、内容和私钥。
三、创建api
API 分组创建完成您就可以创建 API 了,创建 API 是定义 API 请求的过程。您需要在创建中依次定义以下内容:
- API 的基本信息:分组、API 名称、API 类型、API 认证方式、描述。
- API 请求:协议、Method、Path、入参。
- API 服务:后端服务协议、后端服务 Method、后端服务地址、后端服务 Path、服务超时时间、参数映射、系统参数、常量参数。
- API 返回结果:返回类型及示例,目前网关对于返回结果不做处理,直接透传给请求者。后续会支持用户定制化、格式化的定义返回信息。
至此完成 API 的创建,并且具备开放的条件。操作详细说明请看 使用手册(开放API)。
四、发布api
完成 API 创建后,需要进行调试、测试和正式上线 API。
操作步骤:
1.调试
您要把 API 发布到测试环境,然后在 API 网关控制台的调试页面上调试 API。
调试时,会跳过 APP 鉴权 和 签名校验 环节,只是调试 API 的请求链路是否正确。
如果您勾选了 Mock,就是把返回结果定义为一个常量,然后调试时不会真的去请求后端服务,而会直接返回常量结果。这种 Mock 调试模式,不要求后端服务完备。
如果未勾选 Mock,则网关会真实地请求后端服务。返回信息里可能有网关的 X-Ca 开头的返回信息,也会有底层服务真实返回的信息。
2.测试
为了模拟真实的用户请求,您可以自己创建一个 APP,操作您的 API 给这个 APP 授权。
然后按照真实的请求场景,写代码或者基于网关提供的 SDK 样例 请求 API。
您可以将 API 发布到测试或者线上环境,在绑定独立域名之前,可以直接访问二级域名来进行测试调用。请求时注意指定环境,若不指定则默认为访问线上。参见 API 调用示例。
调用API的方法,请您查看 使用手册(调用 API)。
3.发布
完成测试后,您就可以把 API 开放出去了。
要上架到 API 市场则必须将 API 发布到线上,且 API 的类型应为公开。
对外开放的 API,应在所属分组上绑定独立域名,直接访问二级域名有流控限制为1000次/天。
API 网关支持对测试/线上的 API 做版本管理,您可以发布 API、下线 API 还可以切换版本,切换版本是实时生效。
五、授权给应用
应用(APP)代表请求者的身份。当您的客户或者您自己测试调用 API 时,都需要创建 APP 作为请求者的身份,然后由您操作给 APP 授权。
如果您的 API 已经上架云市场,购买者能够给自己的 APP 授权,不需要您再配置。
-
无购买行为时的授权操作需要以下几个步骤:
- 获知待授权的 APP 的 AppID 或者 APP 所有者的阿里云邮箱账号。
- 在授权操作页面,选择一个或者多个准备开放调用权限的 API,选定 测试/线上。
- 选定 API 后,用 AppID 或者阿里云邮箱账号搜索到 APP。
- 确认授权。
注意:授权是区分环境的,同一个API、同一个APP,在两个环境需要分别授权,避免因为授权的环境和请求的环境不一致,导致报错。
六、安全服务
接下来您可以配置安全防护设置。目前 API 网关为您提供后端服务签名密钥和流量控制策略两种安全措施。
-
后端服务签名密钥主要是用于您后端验证网关的身份,在网关请求您后端时,保障您后端的安全。
签名密钥的 Key 和 Secret 都是您自定义的,您将创建的密钥绑定到 API 上后,相当于网关请求这个 API 时需要出示这一对 Key 和 Secret,您后端通过验证签名字符串来验证网关的身份。具体后端签名密钥的说明请参见 后端签名密钥说明文档。
流量控制策略用于您管控 API 服务的流量,详见 流量控制策略。
您还可以在控制台进行更多 API 生命周期的管理操作,如 API 下线、API 版本切换、API调 用情况监控和预警等。更多详情请您查看 使用手册(开放API)。
七、附录
1、后端签名秘钥说明文档
概述
- API 网关提供后端 HTTP 服务签名验证功能,创建签名密钥并将签名密钥绑定到 API 即可开启后端签名(请妥善保管此密钥,API 网关会对密钥进行加密存储来保障密钥的安全性)。
- 开启后端签名后 API 网关到后端HTTP服务的请求将会添加签名信息,后端 HTTP 服务读取 API 网关的签名字符串,然后对收到的请求进行本地签名计算,比对网关与本地签名结果是否一致。
- 所有您定义的参数都会参与签名,包括您录入的业务参数、您定义的常量系统参数和 API 网关系统参数(如 CaClientIp 等)。
- 后端对 API 网关的签名字符串校验后,如果校验失败,建议返回 errorcode = 403;errormessage = “InvalidSignature”。
- 若您的后端服务为VPC环境,且通过内网对接(专属网络VPC环境开放API),您无需使用后端签名,通道自身是安全的。
读取 API 网关签名方法
网关计算的签名保存在 Request 的 Header 中,Header 名称:X-Ca-Proxy-Signature
后端 HTTP 服务加签方法
签名计算的详细 demo(JAVA)请参照链接:https://github.com/aliyun/api-gateway-demo-sign-backend-java。
签名计算方法步骤如下:
组织参与加签的数据
String stringToSign=
HTTPMethod + "\n" + //Method全大写
Content-MD5 + "\n" + //Content-MD5 需要判断是否为空,如果为空则跳过,但是为空也需要添加换行符 "\n"
Headers + //Headers 如果为空不需要添加"\n",不为空的Headers中包含了"\n",详见下面组织Headers的描述
Url
计算签名
Mac hmacSha256 = Mac.getInstance("HmacSHA256");
byte[] keyBytes = secret.getBytes("UTF-8");
hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, "HmacSHA256"));
String sign = new String(Base64.encodeBase64(Sha256.doFinal(stringToSign.getBytes("UTF-8")),"UTF-8"));
secret 为绑定到 API 上的签名密钥
补充说明
-
Content-MD5
Content-MD5 是指 Body 的 MD5 值,只有 HttpMethod 为 PUT 或者 POST 且 Body 为非 Form 表单时才计算 MD5,计算方式为:
String content-MD5 = Base64.encodeBase64(MD5(bodyStream.getbytes(“UTF-8”)));
-
Headers
Headers 指所有参与签名计算的 Header的Key、Value。参与签名计算的 Header 的 Key 从 Request Header 中读取,Key为:”X-Ca-Proxy-Signature-Headers”,多个 Key 用英文逗号分割。
-
Headers 组织方法:
先对所有参与签名计算的 Header 的 Key 按照字典排序,然后将 Header 的 Key 转换成小写后按照如下方式拼接:
String headers = HeaderKey1.toLowerCase() + “:” + HeaderValue1 + “\n”+ HeaderKey2.toLowerCase() + “:” + HeaderValue2 + “\n”+ … HeaderKeyN.toLowerCase() + “:” + HeaderValueN + “\n”
-
Url
Url指 Path+Query+Body 中 Form 参数,组织方法:如果有 Query 或 Form 参数则加 ?,然后对 Query+Form 参数按照字典对 Key 进行排序后按照如下方法拼接,如果没有 Query 或 Form 参数,则 Url = Path
String url =
Path +
"?" +
Key1 + "=" + Value1 +
"&" + Key2 + "=" + Value2 +
...
"&" + KeyN + "=" + ValueN
注意:这里 Query 或 Form 参数的 Value 可能有多个,多个的时候只取第一个 Value 参与签名计算
-
调试模式
为了方便后端签名接入与调试,可以开启 Debug 模式进行调试,具体方法如下:
请求API网关的 Header 中添加 X-Ca-Request-Mode = debug
-
后端服务在 Header 中读取 X-Ca-Proxy-Signature-String-To-Sign 即可,因为 HTTP Header 中值不允许有换行符,因此换行符被替换成了 “|”。
注意:X-Ca-Proxy-Signature-String-To-Sign 不参与后端签名计算。
-
时间戳校验
如果后端需要对请求进行时间戳校验,可以在 API 定义中选择系统参数 “CaRequestHandleTime” ,值为网关收到请求的格林威治时间。
2、流量控制策略
流量控制策略和 API 分别是独立管理的,操作两者绑定后,流控策略才会对已绑定的 API 起作用。
在已有的流量控制策略上,可以额外配置特殊用户和特殊应用(APP),这些特例也是针对当前策略已绑定的API生效。
流量控制策略可以配置对 API、用户、应用三个对象的流控值,流控的单位可以是分钟、小时、天。使用流量控制策略您需要了解以下几点:
-
流量控制策略可以涵盖下表中的维度:
API 流量限制 该策略绑定的API在单位时间内被调用的次数不能超过设定值,单位时间可选分钟、小时、天,如5000次/分钟。 APP 流量限制 每个APP对该策略绑定的任何一个API在单位时间内的调用次数不能超过设定值。如50000次/小时。 用户流量限制 每个阿里云账号对该策略绑定的任何一个 API 在单位时间内的调用次数不能超过设定值。一个阿里云账号可能有多个 APP,所以对阿里云账号的流量限制就是对该账号下所有 APP 的流量总和的限制。如 50 万次/天。 此外,您可以在流控策略下添加特殊应用(APP)和特殊用户。对于特例,流控策略基础的 API 流量限制 依然有效,您需要额外设定一个阈值作为该 APP 或者该用户的流量限制值,该值不能超过策略的 API流量限制 值,同时流控策略基础的 APP流量限制 和 用户流量限制 对该 APP 或用户失效。
与签名密钥相似,当您创建流量控制策略时,需要选择 Region,Region 一旦选定不可更改,且仅能被应用于同一个 Region 下的 API。
由于 API 网关限制,当您设置 API 流量限制 值时,考虑每个 API 分组的默认流控上限是500QPS(该值可以通过提交工单申请提高)。
绑定 API。您可以将策略绑定于多个 API,流控策略的限制值和特例将对该策略绑定的每一个 API 单独生效。当您绑定 API 时,如果该 API 已经与某个策略绑定,您的此次操作将替换之前的策略,实时生效。
特殊对象。如果您想要添加特殊应用或者特殊用户,您需要获得应用 ID 即 AppID 或者用户的阿里云邮箱账号。
在 API 网关控制台,您可以完成对流量控制策略的创建、修改、删除、查看等基本操作。还有流控策略与 API 的绑定解绑,流量控制策略特殊对象的添加删除等操作。