API网关 APIG
API网关 APIG
- 最新动态
- 功能总览
- 服务公告
- 产品介绍
- 计费说明
- 快速入门
-
用户指南
- APIG业务使用流程
- 创建用户并授权使用APIG
- 创建APIG实例
- 开放API
- 配置API调用授权(可选)
- 调用API
-
管理API
- 管理API概述
- 查看或编辑APIG的API信息
- 配置API的自定义认证
- 配置API的参数编排规则
- 自定义API的错误响应信息
- 克隆APIG的API
- 下线APIG的API
- 导入导出API
-
APIG的API设计文件扩展定义
- x-apigateway-auth-type
- x-apigateway-request-type
- x-apigateway-match-mode
- x-apigateway-cors
- x-apigateway-is-send-fg-body-base64
- x-apigateway-any-method
- x-apigateway-backend
- x-apigateway-backend.parameters
- x-apigateway-backend.httpEndpoints
- x-apigateway-backend.httpVpcEndpoints
- x-apigateway-backend.functionEndpoints
- x-apigateway-backend.mockEndpoints
- x-apigateway-backend-policies
- x-apigateway-backend-policies.conditions
- x-apigateway-ratelimit
- x-apigateway-ratelimits
- x-apigateway-ratelimits.policy
- x-apigateway-ratelimits.policy.special
- x-apigateway-access-control
- x-apigateway-access-controls
- x-apigateway-access-controls.policy
- x-apigateway-plugins
- x-apigateway-auth-opt
- x-apigateway-result-normal-sample
- x-apigateway-result-failure-sample
- x-apigateway-authorizer
- x-apigateway-response
- x-apigateway-responses
- x-apigateway-pass-through
- x-apigateway-sample
- x-apigateway-content-type
- x-apigateway-orchestrations
- 配置API策略
- 配置凭据策略
- 管理APIG实例
- 查看监控指标与配置告警
- 查看APIG审计日志
- 共享版操作指导(仅存量用户使用)
- 最佳实践
- 开发指南
-
API参考
- 使用前必读
- API概览
- 如何调用API
-
专享版API(V2)
- 专享版-API分组管理
- 专享版-环境管理
- 专享版-环境变量管理
- 专享版-流控策略管理
- 专享版-API管理
- 专享版-签名密钥管理
- 专享版-签名密钥绑定关系管理
- 专享版-API绑定流控策略
- 专享版-设置特殊流控
- 专享版-APP授权管理
- 专享版-概要查询
- 专享版-域名管理
- 专享版-ACL策略管理
- 专享版-API绑定ACL策略
- 专享版-自定义认证管理
- 专享版-OpenAPI接口
- 专享版-VPC通道管理
- 专享版-监控信息查询
- 专享版-分组自定义响应管理
- 专享版-标签管理
- 专享版-实例特性管理
- 专享版-配置管理
- 专享版-实例管理
- 专享版-实例终端节点管理
- 专享版-实例标签管理
- 专享版-微服务中心管理
- 专享版-SSL证书管理
- 专享版-插件管理
- 专享版-凭据管理
- 专享版-凭据配额管理
- 专享版-异步任务管理
- 专享版-编排规则管理
- 专享版-实例自定义入方向端口管理
- 共享版API(仅存量用户使用)
- 权限策略和授权项
- 附录
- 修订记录
- SDK参考
-
常见问题
- 热门咨询
- 产品咨询
- 开放API
- 发布API
-
调用API
- 调用API失败的可能原因
- 调用API报“414 Request URI too large”
- 调用API报“The API does not exist or has not been published in the environment”
- 调用API报“No backend available”
- API的后端服务报“Backend unavailable”或“Backend timeout”
- API的后端服务报“Backend domain name resolution failed”
- 调用API报“Incorrect IAM authentication information”
- 调用API报“Incorrect app authentication information”
- 修改API后端服务的超时时间上限“backend_timeout”后未生效
- APIG对API请求体的大小是否有限制?
- API调用对请求的响应消息体限制
- 使用iOS系统时,如何使用APP认证调用API?
- 新建一个华为IAM认证方式的API,在配置入参时为什么无法配置HEADER位置的x-auth-token?
- 是否支持移动应用调用API?
- 部署在VPC下的应用是否可以调用API?
- APIG是否支持WebSocket数据传输?
- API的策略后端有多个时,怎么匹配和执行API请求?
- 如何通过APIG访问公网后端服务?
- API认证
- API策略
- 导入导出API
-
更多文档
-
用户指南(吉隆坡区域)
- 产品介绍
- 快速入门
- 新旧版本差异
- 总览
-
API管理
- 创建API分组
- 绑定域名
- 创建环境变量
- 新增网关响应
- 创建API
- 克隆API
- 开启跨域访问
- 调试API
- 授权API
- 发布API
- 下线API
-
导入导出API
- 限制与兼容性说明
- 导入API
- 导出API
-
扩展定义
- x-apigateway-auth-type
- x-apigateway-request-type
- x-apigateway-match-mode
- x-apigateway-cors
- x-apigateway-any-method
- x-apigateway-backend
- x-apigateway-backend.parameters
- x-apigateway-backend.httpEndpoints
- x-apigateway-backend.httpVpcEndpoints
- x-apigateway-backend.functionEndpoints
- x-apigateway-backend.mockEndpoints
- x-apigateway-backend-policies
- x-apigateway-backend-policies.conditions
- x-apigateway-ratelimit
- x-apigateway-ratelimits
- x-apigateway-ratelimits.policy
- x-apigateway-ratelimits.policy.special
- x-apigateway-access-control
- x-apigateway-access-controls
- x-apigateway-access-controls.policy
- x-apigateway-plugins
- 查看API列表
- 支持HTTP2.0
- API策略
- 凭据管理
- 监控分析
- 实例管理
- SDK
- 调用已发布的API
- 权限管理
- 云审计服务支持的关键操作
-
常见问题
- 热门咨询
- API创建
-
API调用
- API调用失败的可能原因有哪些?
- API调用返回错误码如何处理?
- API调用报错“414 Request URI too large”
- "The API does not exist or has not been published in the environment."如何解决?
- No backend available,怎么解决?
- 后端服务调用失败“Backend unavailable”或超时“Backend timeout”原因分析
- 后端服务调用报错域名无法解析“Backend domain name resolution failed”
- 修改后端服务的超时时间上限“backend_timeout”后未生效
- 如何切换调用环境?
- 调用请求包最大支持多少?
- 使用iOS系统时,如何进行APP认证?
- 新建一个IAM认证方式的API,在配置入参时为什么无法配置HEADER位置的x-auth-token?
- 应用(凭据)问题汇总
- 是否支持移动应用调用API?
- 部署在VPC下的应用是否可以调用API?
- API网关是否支持WebSocket数据传输?
- API调用是否支持长连接
- 策略后端有多个时,怎么匹配和执行
- API调用对请求的响应消息体限制
- 如何通过APIG访问公网后端服务
- API认证鉴权
- API控制策略
- API发布
- API导入导出
- API安全
- 其他
- 修订记录
- 开发指南(吉隆坡区域)
-
API参考(吉隆坡区域)
- 使用前必读
- 如何调用API
-
专享版API(V2)
- 专享版-API分组管理
- 专享版-环境管理
- 专享版-环境变量管理
- 专享版-流控策略管理
- 专享版-API管理
- 专享版-签名密钥管理
- 专享版-签名密钥绑定关系管理
- 专享版-API绑定流控策略
- 专享版-设置特殊流控
- 专享版-APP授权管理
- 专享版-概要查询
- 专享版-域名管理
- 专享版-ACL策略管理
- 专享版-API绑定ACL策略
- 专享版-自定义认证管理
- 专享版-OpenAPI接口
- 专享版-VPC通道管理
- 专享版-监控信息查询
- 专享版-分组自定义响应管理
- 专享版-标签管理
- 专享版-实例特性管理
- 专享版-配置管理
- 专享版-实例管理
- 专享版-实例终端节点管理
- 专享版-实例标签管理
- 专享版-SSL证书管理
- 专享版-插件管理
- 专享版-凭据管理
- 专享版-凭据配额管理
- 专享版-异步任务管理
- 权限策略和授权项
- 附录
- 修订记录
-
用户指南(阿布扎比区域)
- 产品介绍
- 快速入门
- 新旧版本差异
- 总览
-
API管理
- 创建API分组
- 导入CCE工作负载
- 绑定域名
- 创建环境变量
- 新增网关响应
- 创建API
- 创建GRPC API
- 克隆API
- 开启跨域访问
- 调试API
- 授权API
- 发布API
- 下线API
-
导入导出API
- 限制与兼容性说明
- 导入API
- 导出API
-
扩展定义
- x-apigateway-auth-type
- x-apigateway-request-type
- x-apigateway-match-mode
- x-apigateway-cors
- x-apigateway-is-send-fg-body-base64
- x-apigateway-any-method
- x-apigateway-backend
- x-apigateway-backend.parameters
- x-apigateway-backend.httpEndpoints
- x-apigateway-backend.httpVpcEndpoints
- x-apigateway-backend.functionEndpoints
- x-apigateway-backend.mockEndpoints
- x-apigateway-backend-policies
- x-apigateway-backend-policies.conditions
- x-apigateway-ratelimit
- x-apigateway-ratelimits
- x-apigateway-ratelimits.policy
- x-apigateway-ratelimits.policy.special
- x-apigateway-access-control
- x-apigateway-access-controls
- x-apigateway-access-controls.policy
- x-apigateway-plugins
- 查看API列表
- 支持HTTP2.0
- API策略
- 凭据管理
- 监控分析
- 实例管理
- SDK
- 调用已发布的API
- 权限管理
- 云审计服务支持的关键操作
-
常见问题
- 热门咨询
- API创建
-
API调用
- API调用失败的可能原因有哪些?
- API调用返回错误码如何处理?
- API调用报错“414 Request URI too large”
- "The API does not exist or has not been published in the environment."如何解决?
- No backend available,怎么解决?
- 后端服务调用失败“Backend unavailable”或超时“Backend timeout”原因分析
- 后端服务调用报错域名无法解析“Backend domain name resolution failed”
- 修改后端服务的超时时间上限“backend_timeout”后未生效
- 如何切换调用环境?
- 调用请求包最大支持多少?
- 使用iOS系统时,如何进行APP认证?
- 新建一个IAM认证方式的API,在配置入参时为什么无法配置HEADER位置的x-auth-token?
- 应用(凭据)问题汇总
- 是否支持移动应用调用API?
- 部署在VPC下的应用是否可以调用API?
- API网关是否支持WebSocket数据传输?
- API调用是否支持长连接
- 策略后端有多个时,怎么匹配和执行
- API调用对请求的响应消息体限制
- 如何通过APIG访问公网后端服务
- API认证鉴权
- API控制策略
- API发布
- API导入导出
- API安全
- 其他
- 修订记录
- 开发指南(阿布扎比区域)
-
API参考(阿布扎比区域)
- 使用前必读
- 如何调用API
-
专享版API(V2)
- 专享版-API分组管理
- 专享版-环境管理
- 专享版-环境变量管理
- 专享版-流控策略管理
- 专享版-API管理
- 专享版-签名密钥管理
- 专享版-签名密钥绑定关系管理
- 专享版-API绑定流控策略
- 专享版-设置特殊流控
- 专享版-APP授权管理
- 专享版-概要查询
- 专享版-域名管理
- 专享版-ACL策略管理
- 专享版-API绑定ACL策略
- 专享版-自定义认证管理
- 专享版-OpenAPI接口
- 专享版-VPC通道管理
- 专享版-监控信息查询
- 专享版-分组自定义响应管理
- 专享版-标签管理
- 专享版-实例特性管理
- 专享版-配置管理
- 专享版-实例管理
- 专享版-实例终端节点管理
- 专享版-实例标签管理
- 专享版-微服务中心管理
- 专享版-SSL证书管理
- 专享版-插件管理
- 专享版-凭据管理
- 专享版-凭据配额管理
- 专享版-异步任务管理
- 权限策略和授权项
- 附录
- 修订记录
- 最佳实践(阿布扎比区域)
- 用户指南(巴黎区域)
- 开发指南(巴黎区域)
- API参考(巴黎区域)
-
用户指南专享版(巴黎区域)
- 产品介绍
- 快速入门
- 新旧版本差异
- 总览
-
API管理
- 创建API分组
- 绑定域名
- 创建环境变量
- 新增网关响应
- 创建API
- 开启跨域访问
- 调试API
- 授权API
- 发布API
- 下线API
-
导入导出API
- 限制与兼容性说明
- 导入API
- 导出API
-
扩展定义
- x-apigateway-auth-type
- x-apigateway-request-type
- x-apigateway-match-mode
- x-apigateway-cors
- x-apigateway-any-method
- x-apigateway-backend
- x-apigateway-backend.parameters
- x-apigateway-backend.httpEndpoints
- x-apigateway-backend.httpVpcEndpoints
- x-apigateway-backend.functionEndpoints
- x-apigateway-backend.mockEndpoints
- x-apigateway-backend-policies
- x-apigateway-backend-policies.conditions
- x-apigateway-ratelimit
- x-apigateway-ratelimits
- x-apigateway-ratelimits.policy
- x-apigateway-ratelimits.policy.special
- x-apigateway-access-control
- x-apigateway-access-controls
- x-apigateway-access-controls.policy
- x-apigateway-plugins
- 查看API列表
- API策略
- 凭据管理
- 监控分析
- 实例管理
- 调用已发布的API
- 权限管理
- 云审计服务支持的关键操作
-
常见问题
- 热门咨询
- API创建
-
API调用
- API调用失败的可能原因有哪些?
- API调用返回错误码如何处理?
- API调用报错“414 Request URI too large”
- "The API does not exist or has not been published in the environment."如何解决?
- No backend available,怎么解决?
- 后端服务调用失败“Backend unavailable”或超时“Backend timeout”原因分析
- 后端服务调用报错域名无法解析“Backend domain name resolution failed”
- 修改后端服务的超时时间上限“backend_timeout”后未生效
- 如何切换调用环境?
- 调用请求包最大支持多少?
- 使用iOS系统时,如何进行APP认证?
- 新建一个IAM认证方式的API,在配置入参时为什么无法配置HEADER位置的x-auth-token?
- 应用(凭据)问题汇总
- 是否支持移动应用调用API?
- 部署在VPC下的应用是否可以调用API?
- API网关是否支持WebSocket数据传输?
- API调用是否支持长连接
- 策略后端有多个时,怎么匹配和执行
- API调用对请求的响应消息体限制
- 如何通过APIG访问公网后端服务
- API认证鉴权
- API控制策略
- API发布
- API导入导出
- API安全
- 其他
- 修订记录
- 开发指南专享版(巴黎区域)
-
API参考专享版 (巴黎区域)
- 使用前必读
- 如何调用API
- 专享版API(V2)
- 权限策略和授权项
- 附录
- 修订记录
-
用户指南(吉隆坡区域)
- 通用参考
链接复制成功!
C#
操作场景
使用C#语言进行后端服务签名时,您需要先获取SDK,然后打开工程,最后参考校验后端签名示例校验签名是否一致。
约束与限制
API绑定签名密钥后,发给后端的请求中才会添加签名信息。
准备环境
- 已获取签名密钥的Key和Secret,请参见签名前准备获取。
- 已在API网关控制台创建签名密钥,并绑定API,具体请参见《API网关用户指南》的“配置API的后端服务签名校验”章节。
- 在API网关控制台选择“帮助中心”,在“SDK使用指引”页签中下载对应语言所使用SDK。
- 已安装Visual Studio 2019 version 16.8.4或以上版本,如果未安装,请至Visual Studio官方网站下载。
打开工程
双击SDK包中的“csharp.sln”文件,打开工程。工程中包含如下3个项目:
- apigateway-signature:实现签名算法的共享库,可用于.Net Framework与.Net Core项目。
- backend-signature:后端服务签名示例,请根据实际情况修改参数后使用。具体代码说明请参考校验后端签名示例。
- sdk-request:签名算法的调用示例。
校验后端签名示例
示例演示如何编写一个基于ASP.Net Core的服务器,作为API的后端,并且实现一个IAuthorizationFilter,对API网关(即API管理)的请求做签名校验。
- 编写一个Controller,提供GET、POST、PUT和DELETE四个接口,且加入ApigatewaySignatureFilter的Attribute。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
// ValuesController.cs namespace backend_signature.Controllers { [Route("api/[controller]")] [ApiController] [ApigatewaySignatureFilter] public class ValuesController : ControllerBase { // GET api/values [HttpGet] public ActionResult<IEnumerable<string>> Get() { return new string[] { "value1", "value2" }; } // POST api/values [HttpPost] public void Post([FromBody] string value) { } // PUT api/values/5 [HttpPut("{id}")] public void Put(int id, [FromBody] string value) { } // DELETE api/values/5 [HttpDelete("{id}")] public void Delete(int id) { } } }
- 实现一个ApigatewaySignatureFilter。将允许的签名key和secret对放入一个Dictionary中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
// ApigatewaySignatureFilter.cs namespace backend_signature.Filters { public class ApigatewaySignatureFilter : Attribute, IAuthorizationFilter { private Dictionary<string, string> secrets = new Dictionary<string, string> { {"signature_key1", "signature_secret1" }, {"signature_key2", "signature_secret2" }, {Environment.GetEnvironmentVariable("SDK_AK1"), Environment.GetEnvironmentVariable("SDK_SK1") }, {Environment.GetEnvironmentVariable("SDK_AK2"), Environment.GetEnvironmentVariable("SDK_SK2") }, }; public void OnAuthorization(AuthorizationFilterContext context) { //签名校验代码 ... } } }
- OnAuthorization函数为签名校验代码。校验流程如下:使用正则表达式解析Authorization头。得到key和signedHeaders。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
private Regex authorizationPattern = new Regex("SDK-HMAC-SHA256\\s+Access=([^,]+),\\s?SignedHeaders=([^,]+),\\s?Signature=(\\w+)"); ... string authorization = request.Headers["Authorization"]; if (authorization == null) { context.Result = new UnauthorizedResult(); return; } var matches = authorizationPattern.Matches(authorization); if (matches.Count == 0) { context.Result = new UnauthorizedResult(); return; } var groups = matches[0].Groups; string key = groups[1].Value; string[] signedHeaders = groups[2].Value.Split(';');
例如,Authorization头为:
1
SDK-HMAC-SHA256 Access=signature_key1, SignedHeaders=host;x-sdk-date, Signature=e11adf65a20d1b82c25419b5********8d0ba12fed1ceb13ed00
则解析的结果为:
1 2
signingKey=signature_key1 signedHeaders=host;x-sdk-date
- 通过key找到secret,如果不存在key,则返回认证失败。
1 2 3 4 5 6
if (!secrets.ContainsKey(key)) { context.Result = new UnauthorizedResult(); return; } string secret = secrets[key];
- 新建一个HttpRequest对象,将请求method、url、query、signedHeaders对应的请求头放入其中。判断是否需要设置body并设置。
需要读取body的条件为:不存在值为UNSIGNED-PAYLOAD的x-sdk-content-sha256头。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
HttpRequest sdkRequest = new HttpRequest(); sdkRequest.method = request.Method; sdkRequest.host = request.Host.Value; sdkRequest.uri = request.Path; Dictionary<string, string> query = new Dictionary<string, string>(); foreach (var pair in request.Query) { query[pair.Key] = pair.Value; } sdkRequest.query = query; WebHeaderCollection headers = new WebHeaderCollection(); string dateHeader = null; bool needBody = true; foreach (var h in signedHeaders) { var value = request.Headers[h]; headers[h] = value; if (h.ToLower() == "x-sdk-date") { dateHeader = value; } if (h.ToLower() == "x-sdk-content-sha256" && value == "UNSIGNED-PAYLOAD") { needBody = false; } } sdkRequest.headers = headers; if (needBody) { request.EnableRewind(); using (MemoryStream ms = new MemoryStream()) { request.Body.CopyTo(ms); sdkRequest.body = Encoding.UTF8.GetString(ms.ToArray()); } request.Body.Position = 0; }
- 校验签名是否过期。从X-Sdk-Date头中取出时间,判断与服务器时间是否相差在15分钟以内。如果signedHeaders中不包含X-Sdk-Date,也返回认证失败。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
private const string BasicDateFormat = "yyyyMMddTHHmmssZ"; ... if(dateHeader == null) { context.Result = new UnauthorizedResult(); return; } DateTime t = DateTime.ParseExact(dateHeader, BasicDateFormat, CultureInfo.CurrentCulture); if (Math.Abs((t - DateTime.Now).Minutes) > 15) { context.Result = new UnauthorizedResult(); return; }
- 调用verify方法校验请求签名。判断校验是否通过。
1 2 3 4 5 6 7
Signer signer = new Signer(); signer.Key = key; signer.Secret = secret; if (!signer.Verify(sdkRequest, groups[3].Value)) { context.Result = new UnauthorizedResult(); }
- 运行服务器,验证代码正确性。下面示例使用JavaScript SDK中的html签名工具生成签名。
填入如图所示字段后,单击“Send request”,复制生成的curl命令,并在命令行中执行,服务器返回200。
如果使用错误的Key和Secret访问,服务器返回401认证不通过。
父主题: 对后端服务进行签名