网关指南: 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 + " " + //Method全大写
Content-MD5 + " " + //Content-MD5 需要判断是否为空,如果为空则跳过,但是为空也需要添加换行符 " "
Headers + //Headers 如果为空不需要添加" ",不为空的Headers中包含了" ",详见下面组织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 + “ ”+ HeaderKey2.toLowerCase() + “:” + HeaderValue2 + “ ”+ … HeaderKeyN.toLowerCase() + “:” + HeaderValueN + “ ”
-
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 的绑定解绑,流量控制策略特殊对象的添加删除等操作。