华为云用户手册

  • 约束与限制 API添加流量控制2.0策略相当于流量控制2.0策略同步绑定了API。同一个环境中,一个API只能被一个流量控制2.0策略绑定,但一个流量控制2.0策略可以绑定多个API。(使用前提是绑定的API已发布。) 如果API未绑定流量控制2.0策略,流控限制值为实例“配置参数”中“ratelimit_api_limits”的参数运行值。 如果一个API绑定传统流量控制策略后,继续绑定流量控制2.0策略,传统流量控制策略会失效。 参数流控的规则最多可定义100个。 策略内容最大长度65535。 如果您的实例不支持流量控制2.0,请联系技术支持。
  • 调试API 为了方便观察,在创建策略后端时后端服务类型选择“Mock”,并且设置Mock返回结果。如果策略后端的后端服务类型为其他,可以观察对应的后端地址是否被成功访问。 在“API运行”页面单击“调试”,调试已创建的API。 响应结果中显示“200 OK”,表示API调用成功,并且返回值中有“策略后端”字样,表示设置的策略后端的匹配条件成功匹配到前端自定义认证函数返回体中的context字段中的键值对,API调用策略后端成功。否则,请参考错误码章节处理。 在“API运行”页面,单击“编辑”,进入API设置页面。 单击“下一步”,进入API的后端设置页面,修改已添加策略后端的策略条件值为“True”。 单击“完成”,完成API的编辑。 再次调试API。 由于此时设置的策略后端的参数和条件值没有匹配到前端自定义认证函数返回体中context字段下的任意键值对,因此,无法通过前端自定义认证参数匹配到API的策略后端,此时API的响应结果显示“200 OK”,但是返回值为“默认后端”,表示此时调用的是API的默认后端。否则,请参考错误码章节处理。
  • 方案优势 流量控制2.0策略可以限制单位时间内API的被调用次数,支持基础流控、参数流控和基于基础流控的特殊流控。 基础流控:可以对API、用户、凭据、源IP进行多维度流控,与已有的流量控制策略说明功能一致,但配置方式不兼容。 参数流控:支持根据Header、Path、Method、Query以及系统变量中的参数值进行自定义流控。 基于基础流控的特殊流控:对某个租户或凭证进行特定的流控。 支持从用户、凭据和时间段等不同的维度限制对API的调用次数。 支持按天以及按时分秒粒度的流量控制。
  • 配置API后端 前端设置完成后,单击“下一步”,进入后端设置页面。 设置“默认后端”的后端服务类型为“Mock”类型,Mock返回结果填写“默认后端”。 单击根据下表添加策略后端。 表2 配置策略后端 参数 配置说明 后端策略名称 填写后端策略名称。 后端服务类型 此处选择“Mock”。 Mock返回结果 此处填写“策略后端”。 策略条件 条件来源:选择“系统参数-前端认证参数”。 参数名称:填写前提条件已创建自定义认证函数返回体中context字段下的 “authstatus1”。 条件类型:选择“相等”。 条件值:填写前提条件已创建自定义认证函数返回体中context字段下的“False”。 单击“完成”,完成创建API。
  • 使用APIG专享版实现不同后端服务的调用操作流程 配置API前端 在API的前端设置页面选择安全认证方式为“自定义认证”或使用双重认证(APP认证或 IAM 认证),并选择指定的自定义认证对象,如果没有,则需要创建自定义认证。 配置API后端 在API的后端设置页面添加策略后端,策略条件的条件来源选择“系统参数-前端认证参数”,并完善参数名称、条件类型、条件值等,其中参数名称和条件值要与前端自定义认证函数返回值中context字段下的键值对一致。 调试API 调试API,观察是否成功调用到已添加的策略后端。 父主题: 使用APIG专享版实现不同后端服务的调用
  • APIG最佳实践汇总 本文汇总了基于API网关服务(APIG,APIGateway)常见应用场景的操作实践,为每个实践提供详细的方案描述和操作指导,帮助用户轻松构建基于APIG的业务。 表1 APIG最佳实践一览表 最佳实践 说明 使用APIG专享版开放云容器引擎CCE工作负载 云容器引擎(Cloud Container Engine,即CCE)中的工作负载,以及微服务,可通过API网关将服务能力以API形式对外开放。 使用APIG专享版开放本地数据中心的服务能力 使用专享版API网关为本地数据中心搭建一条与API网关(所绑定的华为云VPC)之间的专线。 使用FunctionGraph服务实现APIG的自定义认证 API网关支持的自定义认证需要借助 函数工作流 服务实现,用户在函数工作流中创建自定义认证函数,API网关调用该函数,实现自定义认证。 使用APIG专享版跨VPC开放后端服务 当用户后端服务器所在的VPC与创建实例所选择的VPC处于不同的场景时,通过跨VPC对接开放后端服务。 使用WAF对APIG进行安全防护 企业为了保护APIG及后端服务器免受恶意攻击,可在APIG和外部网络之间部署WAF。 使用APIG专享版的流量控制2.0策略实现API的精细流控 随着用户多样性以及需求多样性的增加,传统流控策略无法满足更加精细的流量控制场景。比如针对某一请求参数的流控或者某一租户的流控,APIG在传统流量控制策略的基础上提供了插件策略(流量控制2.0),通过制定更加精细的方案来进行流控。 使用APIG的APP认证和自定义认证实现API的双重认证 在API网关提供的安全认证模式下,用户可根据业务需求,配置自定义认证实现API的双重认证方式。 使用DDoS防护服务为APIG抵御DDoS攻击 当用户在公网中调用APIG上公开的业务API时,会存在DDoS攻击风险,为防范DDoS攻击,华为云提供了DDoS防护服务。 使用APIG专享版实现http到https自动重定向 当用户的API采用http协议访问时,由于http没有传输安全与认证安全保障,可以使用API网关的重定向功能将API升级为安全的https协议访问,同时兼容已有的http协议。 使用APIG专享版实现gRPC服务的路由转发 当用户使用gRPC服务时,可以通过API网关创建API,实现gRPC服务的路由转发。 配置APIG专享版与客户端间的单向认证或双向认证 API前端定义中的请求协议支持HTTPS时,API所属分组在绑定独立 域名 后,还需为独立域名添加SSL证书。SSL证书是进行数据传输加密和身份证明的证书,当SSL证书带有CA证书时,默认开启客户端认证即双向认证;反之,开启单向认证。 使用APIG专享版实现不同后端服务的调用 API网关支持定义多个策略后端,通过不同的策略条件,将API请求转发到不同的后端服务中,用以满足不同的调用场景。例如为了区分普通调用与特殊调用,可以定义一个“策略后端”,通过调用前端自定义认证参数,为特殊调用方分配专用的后端服务。 使用APIG专享版实现WebSocket服务的转发 API网关支持WebSocket API,其创建过程和创建HTTP API一致。WebSocket是一种全双工通信协议,建立在单个TCP连接上,允许在客户端和服务器之间进行双向通信。 APIG共享版迁移到专享版 APIG共享版即将退市,为了避免影响用户的业务,需要将共享版上已有资源迁移到专享版上继续使用。
  • 验证 使用接口测试工具调用已创建的API,或者在客户端调用已创建的API。 填写API所属分组的调试域名。 导入服务端的proto文件。 此处的proto文件如下: syntax = "proto3";package helloworld;// The greeting service definition.service Greeter {// Sends a greetingrpc SayHello (HelloRequest) returns (HelloReply) {}}// The request message containing the user's name.message HelloRequest {string name = 1;}// The response message containing the greetingsmessage HelloReply {string message = 1;} helloworld:包名 Greeter:服务名 SayHello:方法名 HelloRequest:请求体 HelloReply:响应体 参考proto文件在“message”区域中填写API的Request。 { "name": "world"} 单击“Invoke”发送请求。 在“Response”区域中返回API的Response,且状态码显示“0 OK”,表示调用成功。
  • 使用APIG专享版开放云容器引擎CCE工作负载操作流程 准备CCE工作负载信息 在通过API网关将容器的工作负载对外开放前,需要在云容器引擎控制台创建CCE集群(VPC网络模型)或Turbo集群。 开放CCE工作负载 方式一:在API网关中直接创建负载通道并开放API,通过负载通道访问CCE工作负载中的实例地址。 方式二:在API网关中一键式导入CCE工作负载,自动生成API和负载通道,通过负载通道访问CCE工作负载中的实例地址。 (可选)配置工作负载标签实现灰度发布 通过CCE工作负载的标签配置,实现灰度发布。灰度发布是服务发布策略之一,旨在通过调整流量分配权重,逐步将流量从旧版本引导到新版本实例上。 父主题: 使用APIG专享版开放云容器引擎CCE工作负载
  • 应用场景 gRPC是RPC(远程过程调用)的一种,只需定义每个API的Request和Response,剩下的gRPC框架就可以完成。它的典型特征是使用protobuf(protocol buffers)作为其接口定义语言(Interface Definition Language,缩写IDL),同时底层的消息交换格式也是使用protobuf。 当用户使用gRPC服务时,可以通过API网关创建API,实现gRPC服务的路由转发。
  • 使用APIG专享版的流量控制2.0策略实现API的精细流控操作流程 假设您对一个API有如下的流控诉求: 默认API流量限制为10次/60秒,用户流量限制为5次/60秒。 对请求头Header字段为“Host=www.abc.com”的限制为10次/60秒。 对请求方法为get且请求路径为“reqPath= /list”的限制为10次/60秒。 对请求路径为“reqPath= /fc”的限制为10次/60秒。 对特殊租户Special Renter的流量限制为5次/60秒。 您可以根据以下操作流程为API创建并绑定流量控制2.0策略。 创建策略 填写流量控制2.0策略基本信息。 配置基础流控 配置基础流量控制。 配置参数流控 开启参数流控配置开关,定义参数和规则,配置参数流量控制。 配置特殊流控 开启特殊流控配置开关,特殊凭据与特殊租户流量控制的使用场景。 绑定API 流量控制2.0策略绑定到API。 验证 通过相应的请求URL调用API,验证流量控制2.0策略是否生效。 父主题: 使用APIG专享版的流量控制2.0策略实现API的精细流控
  • 应用场景 云容器引擎(Cloud Container Engine,即CCE)中的工作负载,以及微服务,可通过API网关将服务能力以API形式对外开放。 开放CCE工作负载支持以下两种方式,推荐使用方式一直接创建负载通道的方式开放CCE工作负载。 方式一 在API网关中直接创建负载通道,通过负载通道访问CCE工作负载中的实例地址,动态监测工作负载下实例IP地址变化。开放API时使用负载通道访问后端服务,通过API的形式将云容器应用的服务能力开放出来。 方式二 一键式导入CCE工作负载,自动生成API和负载通道,API与相应生成的负载通道绑定,动态监测工作负载下实例IP地址变化。通过API的形式开放云容器引擎中的工作负载以及微服务等能力。
  • 方案优势 无需设置弹性公网IP,节省网络带宽成本。 API网关可通过手动创建的负载通道或者导入CCE的工作负载生成的负载通道,访问CCE中工作负载的地址。 API网关可通过手动创建的负载通道或者导入CCE的工作负载生成的负载通道,动态监测工作负载下所有实例的地址变化,并自动更新到负载通道中。 支持通过CCE工作负载标签配置进行灰度发布,完成灰度测试与版本切换。 提供多种认证方式,增加访问安全性。 提供访问流量控制策略,增加后端服务的安全性。 与直接访问容器应用相比,API网关提供流量控制,确保后端服务稳定运行。 支持多实例负载均衡,合理利用资源,增加系统可靠性。
  • 准备环境 获取并安装IntelliJ IDEA 2018.3.5或以上版本,可至IntelliJ IDEA官方网站下载。 获取并安装PHP安装包8.0.3或以上版本,可至PHP官方下载页面下载。 将PHP安装目录中的“php.ini-production”文件复制到“C:\windows”,改名为“php.ini”,并在文件中增加如下内容。 123 extension_dir = "{php安装目录}/ext"extension=opensslextension=curl 在IDEA中安装PHP插件,如下图所示。
  • 使用APIG专享版跨VPC开放后端服务操作流程 创建VPC 创建两个VPC,VPC1为API网关所在VPC,VPC2为后端应用所在VPC。 创建实例 在VPC1上创建API专享版实例。 创建弹性负载均衡 在VPC2上创建弹性负载均衡。 创建对等连接 创建VPC Peering对等连接,打通VPC1和VPC2。 配置路由 在API专享版实例上配置路由,配置IP为购买ELB所在VPC2网段。 创建API 创建API,后端服务地址配置ELB的IP。 创建E CS 选择VPC2为其VPC,并在其上部署后端应用服务,创建Elastic Cloud Server(应用服务器)。 调试API 验证对接内网ELB是否成功。 父主题: 使用APIG专享版跨VPC开放后端服务
  • 请求签名与API调用 在工程中引入sdk。 123456 using System;using System.Net;using System.IO;using System.Net.Http;using System.Threading;using APIGATEWAY_SDK; 生成一个新的Signer, 填入AK和SK。 本示例以AK和SK保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。以Linux系统为例在本地将已获取的AK/SK设置为环境变量。 打开终端,输入以下命令打开环境变量配置文件。 vi ~/.bashrc 设置环境变量,保存文件并退出编辑器。 export HUAWEICLOUD_SDK_AK="已获取AK值" export HUAWEICLOUD_SDK_SK="已获取SK值" 输入以下命令使配置文件生效。 source ~/.bashrc 生成一个新的Signer, 填入已设置的环境变量。 12345 Signer signer = new Signer();// Directly writing AK/SK in code is risky. For security, encrypt your AK/SK and store them in the configuration file or environment variables.// In this example, the AK/SK are stored in environment variables for identity authentication. Before running this example, set environment variables HUAWEICLOUD_SDK_AK and HUAWEICLOUD_SDK_SK.signer.Key = Environment.GetEnvironmentVariable("HUAWEICLOUD_SDK_AK");signer.Secret = Environment.GetEnvironmentVariable("HUAWEICLOUD_SDK_SK"); 生成一个新的Request,指定域名、方法名、请求uri和body。 1234 //The following example shows how to set the request URL and parameters to query a VPC list.HttpRequest r = new HttpRequest("GET", new Uri("https://{service}.region.example.com/v1/77b6a44cba5**********9a8ff44fd/vpcs?limit=1"));//Add a body if you have specified the PUT or POST method. Special characters, such as the double quotation mark ("), contained in the body must be escaped.r.body = ""; 添加需要签名的其他头域,或者其他用途的头域,如API的环境信息添加x-stage,多项目场景中添加X-Project-Id,或者全局服务场景中添加X-Domain-Id。 1234 r.headers.Add("x-stage", "RELEASE");r.headers.Add("X-Project-Id", "xxx");r.headers.Add("X-Domain-Id", "xxx");//Add header parameters, for example, X-Domain-Id for invoking a global service and X-Project-Id for invoking a project-level service. 进行签名,执行此函数会生成一个新的HttpWebRequest,并在请求参数中添加用于签名的X-Sdk-Date头和Authorization头。 如果您使用HTTP Client,可以从请求中获取头部信息使用。关于头部信息,请参考AK/SK签名认证算法详解。 1 HttpWebRequest req = signer.Sign(r); 访问API,查看访问结果。 1 2 3 4 5 6 7 8 9101112131415161718192021222324 try{ var writer = new StreamWriter(req.GetRequestStream()); writer.Write(r.body); writer.Flush(); HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); var reader = new StreamReader(resp.GetResponseStream()); Console.WriteLine(reader.ReadToEnd());}catch (WebException e){ HttpWebResponse resp = (HttpWebResponse)e.Response; if (resp != null) { Console.WriteLine((int)resp.StatusCode + " " + resp.StatusDescription); var reader = new StreamReader(resp.GetResponseStream()); Console.WriteLine(reader.ReadToEnd()); } else { Console.WriteLine(e.Message); }}Console.WriteLine("----------------");
  • 获取SDK 点此下载SDK与Demo。 解压后目录结构如下: 名称 说明 apigateway-signature\Signer.cs SDK代码 apigateway-signature\HttpEncoder.cs sdk-request\Program.cs 签名请求示例代码 csharp.sln 工程文件 licenses\license-referencesource 第三方库license文件
  • 获取SDK 签名SDK只包含签名功能,不包含云服务的SDK功能,云服务SDK请参见SDK。 点此下载SDK与Demo。 解压时选择解压到当前文件夹,解压后目录结构如下: 名称 说明 hasher.cpp SDK代码 hasher.h header.h RequestParams.cpp RequestParams.h signer.cpp signer.h constants.h Makefile Makefile文件 main.cpp 示例代码
  • 准备环境 获取并安装IntelliJ IDEA 2018.3.5或以上版本,可至IntelliJ IDEA官方网站下载。 获取并安装Python安装包(可使用2.7.9+或3.X,包含2.7.9),可至Python官方下载页面下载。 Python安装完成后,在命令行中使用pip安装“requests”库。 pip install requests 如果pip安装requests遇到证书错误,请下载并使用Python执行此文件,升级pip,然后再执行以上命令安装。 在IDEA中安装Python插件,如下图所示。
  • 请求签名与API调用 在命令行中,使用pip安装“requests”库。 1 pip install requests 在工程中引入apig_sdk。 12 from apig_sdk import signerimport requests 生成一个新的Signer,填入AK和SK。 本示例以AK和SK保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。以Linux系统为例在本地将已获取的AK/SK设置为环境变量。 打开终端,输入以下命令打开环境变量配置文件。 vi ~/.bashrc 设置环境变量,保存文件并退出编辑器。 export HUAWEICLOUD_SDK_AK="已获取AK值" export HUAWEICLOUD_SDK_SK="已获取SK值" 输入以下命令使配置文件生效。 source ~/.bashrc 生成一个新的Signer,填入已设置的环境变量。 123456 sig = signer.Signer()# Set the AK/SK to sign and authenticate the request.# Directly writing AK/SK in code is risky. For security, encrypt your AK/SK and store them in the configuration file or environment variables.# In this example, the AK/SK are stored in environment variables for identity authentication. Before running this example, set environment variables HUAWEICLOUD_SDK_AK and HUAWEICLOUD_SDK_SK.sig.Key = os.getenv('HUAWEICLOUD_SDK_AK')sig.Secret = os.getenv('HUAWEICLOUD_SDK_SK') 生成一个新的Request,指定域名、方法名、请求uri和body。 以虚拟私有云服务的查询VPC列表接口为例,HTTP方法为GET,域名(Endpoint)为service.region.example.com,请求URI:/v1/77b6a44cba5143ab91d13ab9a8ff44fd/vpcs?limit=1 123 # The following example shows how to set the request URL and parameters to query a VPC list.r = signer.HttpRequest("GET", "https://{service}.region.example.com/v1/77b6a44cba5143ab91d13ab9a8ff44fd/vpcs?limit=1")# r.body = "{\"a\":1}" 添加需要签名的请求消息头,或者其他用途的头域,如多项目场景中添加X-Project-Id,或者全局服务场景中添加X-Domain-Id。如果添加多个请求消息头,使用英文逗号分隔。 1 r.headers = {"X-Project-Id": "xxx"} 进行签名,执行此函数会在请求参数中添加用于签名的X-Sdk-Date头和Authorization头。 1 sig.Sign(r) X-Sdk-Date是一个必须参与签名的请求消息头参数。 您无需关注哪些消息头参数参与了签名,由SDK自行完成。 访问API,查看访问结果。 123 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)
  • AK/SK签名认证流程 客户端涉及的AK/SK签名以及请求发送的流程概述如下: 构造规范请求。 将待发送的请求内容按照与API网关后台约定的规则组装,确保客户端签名、API网关后台认证时使用的请求内容一致。 使用规范请求和其他信息创建待签字符串。 使用AK/SK和待签字符串计算签名。 将生成的签名信息作为请求消息头添加到HTTP请求中,或者作为查询字符串参数添加到HTTP请求中。 本章节主要用于帮助用户自行完成API请求的签名。 签名SDK与demo章节提供了常用语言的签名SDK以及demo,与本章节提供的算法逻辑一致,您可以直接使用,省去自签名步骤。 父主题: AK/SK签名认证算法详解
  • 添加签名信息到请求头 在计算签名后,将它添加到Authorization的HTTP消息头。Authorization消息头未包含在已签名消息头中,主要用于身份验证。 伪代码如下: Authorization header创建伪码:Authorization: algorithm Access=Access key, SignedHeaders=SignedHeaders, Signature=signature 需要注意的是算法与Access之前有空格但没有逗号,但是SignedHeaders与Signature之前需要使用逗号隔开。 得到的签名消息头为: SDK-HMAC-SHA256 Access=QTWA***KYUC, SignedHeaders=content-type;host;x-sdk-date, Signature=7be6668032f70418fcc22abc52071e57aff61b84a1d2381bb430d6870f4f6ebe 得到签名消息头后,将其增加到原始HTTP请求内容中,请求将被发送给云服务API网关,由API网关完成身份认证。身份认证通过后,该请求才会发送给具体的云服务进行业务处理。 包含签名信息的完整请求如下: GET /v1/77b6a44cba5143ab91d13ab9a8ff44fd/vpcs?limit=2&; marker=13551d6b-755d-4757-b956-536f674975c0 HTTP/1.1Host: service.region.example.comContent-Type: application/jsonx-sdk-date: 20191115T033655ZAuthorization: SDK-HMAC-SHA256 Access=QTWA***KYUC, SignedHeaders=content-type;host;x-sdk-date, Signature=7be6668032f70418fcc22abc52071e57aff61b84a1d2381bb430d6870f4f6ebe Curl方式样例如下: curl -X GET "https://service.region.example.com/v1/77b6a44cba5143ab91d13ab9a8ff44fd/vpcs?limit=2&marker=13551d6b-755d-4757-b956-536f674975c0" -H "content-type: application/json" -H "X-Sdk-Date: 20191115T033655Z" -H "host: service.region.example.com" -H "Authorization: SDK-HMAC-SHA256 Access=QTWA***KYUC, SignedHeaders=content-type;host;x-sdk-date, Signature=7be6668032f70418fcc22abc52071e57aff61b84a1d2381bb430d6870f4f6ebe" -d $'' 父主题: AK/SK签名认证算法详解
  • 概述 本手册将介绍如何使用AK/SK签名认证方式调用通过API网关开放的云服务API,提供签名流程与实现逻辑,以及Java、Go、Python、C等多种不同语言的签名SDK和调用示例。 部分云服务开放的API,不通过API网关,签名认证流程请先参考云服务自身提供的API参考手册。 各云服务API参考手册中的“如何调用API”章节,介绍了认证方法。 SDK打包在示例中,可单独获取SDK,然后参考示例与各语言的API调用说明部分,将SDK集成到您的应用中。 如果本手册的多语言签名示例没有涵盖您使用的编程语言,请根据签名流程与算法,自主实现请求的签名。 API调用的另一种认证方式为Token认证,Token认证的说明与示例包含在各云服务的API参考手册中的“认证鉴权”章节。 AK/SK签名认证方式,仅支持Body体大小为12M以内,12M以上的请求,需使用Token认证。 云服务具体的API在各云服务的API参考手册中列明。 客户端须注意本地时间与时钟服务器的同步,避免请求消息头X-Sdk-Date的值出现较大误差。 API网关除了校验时间格式外,还会校验该时间值与网关收到请求的时间差,如果时间差超过15分钟,API网关将拒绝请求。
  • 构造规范请求 使用AK/SK方式进行签名与认证,首先需要规范请求内容,然后再进行签名。客户端与云服务API网关使用相同的请求规范,可以确保同一个HTTP请求的前后端得到相同的签名结果,从而完成身份校验。 HTTP请求规范伪代码如下: CanonicalRequest = HTTPRequestMethod + '\n' + CanonicalURI + '\n' + CanonicalQueryString + '\n' + CanonicalHeaders + '\n' + SignedHeaders + '\n' + HexEncode(Hash(RequestPayload)) 以虚拟私有云服务的一个查询VPC列表接口为例,说明规范请求的构造步骤。 假设原始请求: GET https://service.region.example.com/v1/77b6a44cba5143ab91d13ab9a8ff44fd/vpcs?limit=2&marker=13551d6b-755d-4757-b956-536f674975c0 HTTP/1.1Host: service.region.example.comX-Sdk-Date: 20191115T033655Z 构造HTTP请求方法(HTTPRequestMethod),以换行符结束。 HTTP请求方法,如GET、PUT、POST等。请求方法示例: GET 添加规范URI参数(CanonicalURI),以换行符结束。 释义: 规范URI,即请求资源路径,是URI的绝对路径部分的URI编码。 格式: 根据RFC 3986规范化URI路径,移除冗余和相对路径部分,路径中每个部分必须为URI编码。如果URI路径不以“/”结尾,则在尾部添加“/”。 举例: URI具体见云服务的API参考手册,每个API章节都提供对应的资源路径。如虚拟私有云服务的查询VPC列表:/v1/{project_id}/vpcs,此时规范的URI编码为: GET/v1/77b6a44cba5143ab91d13ab9a8ff44fd/vpcs/ 计算签名时,URI必须以“/”结尾。发送请求时,可以不以“/”结尾。 添加规范查询字符串(CanonicalQueryString),以换行符结束。 释义: 查询字符串,即查询参数。如果没有查询参数,则为空字符串,即规范后的请求为空行。 格式: 规范查询字符串需要满足以下内容: 根据以下规则对每个参数名和值进行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开头的参数名之前。 以排序后的第一个参数名开始,构造规范查询字符串。 举例: 查询VPC列表有两个可选参数:limit(每页返回的个数)、marker(分页查询的起始VPC资源ID) GET/v1/77b6a44cba5143ab91d13ab9a8ff44fd/vpcs/limit=2&marker=13551d6b-755d-4757-b956-536f674975c0 添加规范消息头(CanonicalHeaders),以换行符结束。 释义: 规范消息头,即请求消息头列表。包括签名请求中的所有HTTP消息头列表。消息头必须包含X-Sdk-Date,用于校验签名时间,格式为ISO8601规范的UTC时间格式:YYYYMMDDTHHMMSSZ。 客户端须注意本地时间与时钟服务器的同步,避免请求消息头X-Sdk-Date的值出现较大误差。 API网关除了校验时间格式外,还会校验该时间值与网关收到请求的时间差,如果时间差超过15分钟,API网关将拒绝请求。 格式: CanonicalHeaders由多个请求消息头共同组成,CanonicalHeadersEntry0 + CanonicalHeadersEntry1 + ...,其中每个请求消息头(CanonicalHeadersEntry )的格式为Lowercase(HeaderName) + ':' + Trimall(HeaderValue) + '\n' Lowercase表示将所有字符转换为小写字母的函数。 Trimall表示删除值前后的多余空格的函数。 最后一个请求消息头也会携带一个换行符。叠加规范中CanonicalHeaders自身携带的换行符,因此会出现一个空行。 举例: 查询VPC列表的消息头,需要包含签名时间(X-Sdk-Date),云服务Endpoint(Host)、内容类型(Content-Type)。 GET/v1/77b6a44cba5143ab91d13ab9a8ff44fd/vpcs/limit=2&marker=13551d6b-755d-4757-b956-536f674975c0content-type:application/jsonhost:service.region.example.comx-sdk-date:20191115T033655Z 规范消息头需要满足以下内容: 将消息头名称转换为小写形式,并删除前导空格和尾随空格。 按照字符代码对消息头名称进行升序排序。 例如原始消息头为: Host: service.region.example.com\nContent-Type: application/json;charset=utf8\nMy-header1: a b c \nX-Sdk-Date:20190318T094751Z\nMy-Header2: "x y \n 对消息头名称转小写,按消息头名称字符代码对消息头排序,将消息头的值去掉前导空格与尾随空格。最终得到规范消息头: content-type:application/json;charset=utf8\nhost:service.region.example.com\nmy-header1:a b c\nmy-header2:"x y\nx-sdk-date:20190318T094751Z\n 添加用于签名的消息头声明(SignedHeaders),以换行符结束。 释义: 用于签名的请求消息头列表。通过添加此消息头,向API网关告知请求中哪些消息头是签名过程的一部分,以及在验证请求时API网关可以忽略哪些消息头。X-Sdk-date必须作为已签名的消息头。 格式: SignedHeaders = Lowercase(HeaderName0) + ';' + Lowercase(HeaderName1) + ";" + ... 已签名的消息头需要满足的内容:将已签名的消息头名称转换为小写形式,按照字符代码对消息头进行排序,并使用“;”来分隔多个消息头。 Lowercase表示将所有字符转换为小写字母。 举例: 以下表示有三个消息头参与签名:Content-Type、Host、X-Sdk-Date GET/v1/77b6a44cba5143ab91d13ab9a8ff44fd/vpcs/limit=2&marker=13551d6b-755d-4757-b956-536f674975c0content-type:application/jsonhost:service.region.example.comx-sdk-date:20191115T033655Zcontent-type;host;x-sdk-date 签名后消息头将为: SignedHeaders=content-type;host;x-sdk-date 消息头添加到请求的具体示例请参考添加签名信息到请求头。 使用SHA 256哈希函数以基于HTTP或HTTPS请求正文中的body体(RequestPayload),创建哈希值。 释义: 请求消息体。消息体需要做两层转换:HexEncode(Hash(RequestPayload)),其中Hash表示生成消息摘要的函数,当前支持SHA-256算法。HexEncode表示以小写字母形式返回摘要的Base-16编码的函数。例如,HexEncode("m") 返回值为“6d”而不是“6D”。输入的每一个字节都表示为两个十六进制字符。 计算RequestPayload的哈希值时,对于“RequestPayload==null”的场景,直接使用空字符串""来计算。 举例: 本示例为GET方法,body体为空。经过哈希处理的body(空字符串)如下: GET/v1/77b6a44cba5143ab91d13ab9a8ff44fd/vpcs/limit=2&marker=13551d6b-755d-4757-b956-536f674975c0content-type:application/jsonhost:service.region.example.comx-sdk-date:20191115T033655Zcontent-type;host;x-sdk-datee3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 至此,规范请求构造完成。 对构造好的规范请求进行哈希处理,算法与对RequestPayload哈希处理的算法相同。经过哈希处理的规范请求必须以小写十六进制字符串形式表示。 算法伪代码:Lowercase(HexEncode(Hash.SHA256(CanonicalRequest))) 经过哈希处理的规范请求示例: b25362e603ee30f4f25e7858e8a7160fd36e803bb2dfe206278659d71a9bcd7a 父主题: AK/SK签名认证算法详解
  • 创建待签字符串 对HTTP请求进行规范并取得请求的哈希值后,将其与签名算法、签名时间一起组成待签名字符串。 StringToSign = Algorithm + \n + RequestDateTime + \n + HashedCanonicalRequest 伪代码中参数说明如下。 Algorithm 签名算法。对于SHA 256,算法为SDK-HMAC-SHA256。 RequestDateTime 请求时间戳。与请求消息头X-Sdk-Date的值相同,格式为YYYYMMDDTHHMMSSZ。 HashedCanonicalRequest 将构造规范请求中构造的规范请求以SHA256算法生成的hash值。 上述例子得到的待签字符串为: SDK-HMAC-SHA25620191115T033655Zb25362e603ee30f4f25e7858e8a7160fd36e803bb2dfe206278659d71a9bcd7a 父主题: AK/SK签名认证算法详解
  • 使用临时AK/SK做签名 如果使用临时AK/SK对请求签名,您将签名SDK集成到应用时,请在消息头添加以下参数和参数值: X-Security-Token:{securityToken} 然后使用临时AK/SK对请求进行签名,签名SDK与AK/SK的签名SDK一致。 创建一个API,安全认证选择“华为IAM认证”,并发布。 获取当前账号的临时AK/SK与{securityToken},请参考IAM接口文档。 例如获得响应参数为: { "credential": { "access": "P0HE****69X0", "expires_at": "2022-10-17T18:51:25.231000Z", "secret": "3WJu****hDVs", "securitytoken": "XXXXXX......" }} 构造请求,填写签名参数。 ...request.setKey("P0HE****69X0");request.setSecret("3WJu****hDVs");request.setMethod("GET");request.setUrl("url");request.addHeader("X-Security-Token", "XXXXXX......");... 父主题: 常见问题
  • 请求签名与API调用 在Android工程中的“app/libs”目录下,加入SDK所需jar包。其中jar包必须包括: java-sdk-core-x.x.x.jar commons-logging-1.2.jar joda-time-2.9.9.jar 在“build.gradle”文件中加入okhttp库的依赖。 在“build.gradle”文件中的“dependencies”下加入“implementation 'com.squareup.okhttp3:okhttp:3.11.0'”。 12345 dependencies { ... ... implementation 'com.squareup.okhttp3:okhttp:3.11.0'} 创建request,输入AK和SK,并指定域名、方法名、请求uri和body。 本示例以AK和SK保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。以Linux系统为例在本地将已获取的AK/SK设置为环境变量。 打开终端,输入以下命令打开环境变量配置文件。 vi ~/.bashrc 设置环境变量,保存文件并退出编辑器。 export HUAWEICLOUD_SDK_AK="已获取AK值" export HUAWEICLOUD_SDK_SK="已获取SK值" 输入以下命令使配置文件生效。 source ~/.bashrc 创建request,填入已设置的环境变量,并指定域名、方法名、请求uri和body。 1 2 3 4 5 6 7 8 9101112131415 Request request = new Request();try {// Directly writing AK/SK in code is risky. For security, encrypt your AK/SK and store them in the configuration file or environment variables.// In this example, the AK/SK are stored in environment variables for identity authentication. Before running this example, set environment variables HUAWEICLOUD_SDK_AK and HUAWEICLOUD_SDK_SK. request.setKey(System.getenv("HUAWEICLOUD_SDK_AK")); request.setSecret(System.getenv("HUAWEICLOUD_SDK_SK")); request.setMethod("GET"); request.setUrl("https://service.region.example.com3/v1/{project_id}/vpcs"); request.addQueryStringParam("name", "value"); request.addHeader("Content-Type", "text/plain"); //request.setBody("demo");} catch (Exception e) {e.printStackTrace();return;} 对请求进行签名,生成okhttp3.Request对象来访问API。 123 okhttp3.Request signedRequest = Client.signOkhttp(request);OkHttpClient client = new OkHttpClient.Builder().build();Response response = client.newCall(signedRequest).execute();
  • "The API does not exist or has not been published in the environment."如何解决? 调用API网关中开放的API报错,请按以下顺序排查可能原因: 调用API所使用的域名、请求方法、路径不正确。 比如创建的API为POST方法,您使用了GET方法调用。 比如访问的URL比API详情中的URL少一个“/”也会导致无法匹配上此API,例如http://7383ea59c0cd49a2b61d0fd1d351a619.apigw.region.cloud.com/test/和http://7383ea59c0cd49a2b61d0fd1d351a619.apigw.region.cloud.com/test会匹配上不同的API。 API没有发布。API创建后,需要发布到具体的环境后才能使用。具体操作请参考发布API。如果发布到非生产环境,检查请求“X-Stage”头是否为发布的环境名。 域名解析不正确。如果API的域名、请求方法、路径正确,且已发布到环境,有可能是没有准确解析到您的API所在分组。请检查API所在的分组域名,例如您有多个API分组,每个分组有自己的独立域名,API调用时,使用了其他分组的独立域名。 检查API是否使用OPTIONS跨域请求,如果使用OPTIONS跨域请求,请在API中开启CORS,并创建OPTIONS方式的API。具体操作请参考开启跨域共享。 父主题: 常见问题
  • Incorrect app authentication information: app not found, appkey xxx { "error_msg": "Incorrect app authentication information: app not found, appkey 01177c425f71487ea362ba84dc4abe5e1", "error_code": "APIGW.0303", "request_id": "a5322eb8904***d705491a76a05aca"}
  • Incorrect app authentication information: verify signature fail, canonicalRequest { "error_msg": "Incorrect app authentication information: verify signature fail, canonicalRequest:GET|/test/||host:d7***fe4.example.com|x-sdk-date:20230527T015431Z||host;x-sdk-date|e3b0c44298f***2b855", "error_code": "APIGW.0303", "request_id": "cb141a91c945e6***14a8eff5d62dc"}
  • Incorrect IAM authentication information: AK access failed to reach the limit, forbidden { "error_msg": "Incorrect IAM authentication information: AK access failed to reach the limit,forbidden." ...... "error_code": "APIGW.0301", "request_id": "******" }
共100000条