华为云用户手册

  • 编写自定义认证函数 在 函数工作流 的控制台编写函数,自定义认证的代码编写指南参见创建用于前端自定义认证的函数。 根据下表参数说明,在函数工作流页面创建一个函数。 表1 函数信息配置 参数 配置说明 选择创建方式 默认“创建空白函数”。 函数类型 默认“事件函数”。 区域 与API网关相同区域。 项目 华为云的区域默认对应一个项目,这个项目由系统预置,用来隔离物理区域间的资源(计算资源、存储资源和网络资源),以默认项目为单位进行授权,用户可以访问您账号中该区域的所有资源。此处默认为已选择的区域。 函数名称 根据规划自定义名称。 企业项目 企业项目是项目的升级版,针对企业不同项目间资源的分组和管理,是逻辑隔离。此处默认“default”。 委托名称 用户委托函数工作流去访问其他的云服务。此处选择“未使用任何委托”。 运行时 选择Python 3.6。 函数创建完成后,进入函数详情。在“代码”页签,将以下代码复制到index.py中(如果您使用的是专享版网关,并且实例支持authorizer_context_support_num_bool特性,那么context中的value的类型可以为boolean类型或number类型)。 1 2 3 4 5 6 7 8 91011121314151617181920212223242526 # -*- coding:utf-8 -*-import jsondef handler(event, context):#以下表示认证信息匹配正确,则返回用户名, if event["headers"]["authorization"]=='Basic dXN****cmQ=': return { 'statusCode': 200, 'body': json.dumps({ "status":"allow", "context":{ "user_name":"user1" } }) } else: return { 'statusCode': 200, 'body': json.dumps({ "status":"deny", "context":{ "code": "1001", "message":"incorrect username or password", "authorizer_success": "false" } }) }
  • 使用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的精细流控
  • 应用场景 gRPC是RPC(远程过程调用)的一种,只需定义每个API的Request和Response,剩下的gRPC框架就可以完成。它的典型特征是使用protobuf(protocol buffers)作为其接口定义语言(Interface Definition Language,缩写IDL),同时底层的消息交换格式也是使用protobuf。 当用户使用gRPC服务时,可以通过API网关创建API,实现gRPC服务的路由转发。
  • 创建实例 进入API网关控制台。 在左侧导航栏选择“实例管理”。 单击“购买实例”。 表3 实例信息 参数 配置说明 计费模式 选择实例的计费模式,此处选择“按需计费”。 区域 选择实例所在的区域,且与VPC1同区域。 可用区 选择实例所在的可用区,此处选择“可用区1”。 实例名称 填写实例的名称,根据规划自定义。 实例规格 选择实例的容量规格,实例创建后规格不可修改,此处选择“专业版”。 可维护时间窗 选择技术支持对实例进行维护的时间段,建议选择业务量较少的时间段,保持默认设置“22:00:00---02:00:00”。 企业项目 选择实例所属的企业项目,保持默认设置“default”。 网络 选择已创建的虚拟私有云“VPC1”和子网。 安全组 单击“管理安全组”,创建安全组,企业项目选择“default”后,即可创建。 描述 填写实例的描述信息。 单击“立即购买”。 规格确认无误后,勾选用户协议和隐私政策的阅读并同意声明。开始创建实例,界面显示创建进度。
  • 创建E CS 进入云服务器控制台。 单击“购买弹性云服务器”。 基础配置后,单击“下一步:网络配置”。 表9 基础配置 参数 配置说明 计费模式 选择“按需计费”。 区域 选择弹性云服务器所属区域,且与VPC2同一区域。 可用区 选择弹性云服务器所属可用区。 CPU架构 默认“x86计算”。 规格 根据业务规划,选择规格。 镜像 根据业务规划,选择镜像。 虚拟私有云 选择已创建的虚拟私有云“VPC2”。 主网卡 选择已创建的虚拟私有云的子网。 安全组 选择专享版实例中已创建的安全组。 弹性公网IP 选择“暂不购买”。 云服务器名称 填写弹性云服务器名称。 登录凭证 登录云服务器凭证,此处默认“密码”。 用户名 默认“root”。 密码 填写登录云服务器的密码。 确认密码 保证密码正确性。 企业项目 此处选择“default”。 同意协议声明后,单击“立即购买”。
  • 操作流程 创建函数 创建自定义的前端函数,使用函数服务开发自定义认证。 创建自定义认证 创建自定义认证,类型选择“前端”,函数地址选择上一步创建的函数。 创建API 安全配置中的安全认证选择APP认证,并勾选“支持双重认证”,选择上一步创建的自定义认证。 创建凭据 使用APP认证的API,需要在API网关中创建一个凭据,生成凭据ID和密钥对(Key、Secret)。 绑定API 将创建的凭据绑定API后,才可以使用APP认证调用API。 验证 调用API,验证双重认证是否设置成功。
  • 连通云专线与API网关 创建VPC。如果已有VPC,可跳过此步骤。 具体操作请参考《虚拟私有云 VPC》。 专享版API网关需要绑定1个VPC,将本地数据中心与VPC之间建立云专线后,API网关即可访问本地数据中心的服务。 需要为API网关规划1个子网段。 一条云专线只能打通本地数据中心到1个VPC的网络,您在云上的资源,建议都绑定到同一VPC中,避免不同VPC都需要使用云专线访问本地数据中心带来的成本增加。 图2 创建VPC示例参考 创建专享版API网关。 具体请参考购买专享版API网关章节。 购买云专线。 购买一条连接本地数据中心到华为云API网关(所绑定的虚拟私有云)的云专线,请按以下操作顺序执行: 购买物理连接接入 即购买一条连接本地数据中心与华为云的运营商线路。建议您选择“一站式接入”,华为云负责施工工程。 如果已有数据中心到华为云的物理连接,可直接使用。 创建虚拟网关 虚拟网关用于关联专享版API网关绑定的VPC。 在选择VPC网段时,需要添加专享版API网关所使用的网段,表示允许专线可访问的VPC子网。可在专享版API网关控制台查询网段详情。 创建虚拟接口 虚拟接口将物理连接与虚拟网关(配置了VPC和网段)关联绑定,打通物理与专享版API网关所在VPC的网络。 注意远端网关与远端子网要分别配置您本地数据中心的开放API接口访问的网关和子网。例如您本地数据中心的API调用地址为http://192.168.0.25:80/{URI},则远端网关和远端子网要配置192.168.0.25所在的子网段与网关。 配置本地路由 如果本地数据中心的子网不在以下三个大子网段内,暂时不支持配置本地路由:10.0.0.0/8-24、172.16.0.0/12-24、192.168.0.0/16-24。 验证网络连通。 再创建一台按需的ECS,选择与专享版API网关相同的VPC、子网与安全组。只要本地数据中心能连通ECS,则与专享版API网关也能连通。 连通云专线与API网关后,然后使用专享版API网关开放API。
  • 应用场景 API网关的后端服务有3类部署形态: 后端服务部署在虚拟私有云(以下简称VPC)中,仅支持私有地址访问。 可在API网关创建VPC通道,利用VPC通道,打通API网关与虚拟私有云的网络路由。 后端服务部署在公网环境中,即可以直接通过公网地址访问。 后端服务部署在本地数据中心,且不能通过公网地址直接访问。 如果您使用专享版API网关,可为本地数据中心搭建一条与API网关(所绑定的华为云VPC)之间的专线。 本节针对后端服务部署在本地数据中心的场景,介绍使用API网关开放API的实践步骤。
  • 方案优势 无需设置弹性公网IP,节省网络带宽成本。 API网关可通过手动创建的负载通道或者导入CCE的工作负载生成的负载通道,访问CCE中工作负载的地址。 API网关可通过手动创建的负载通道或者导入CCE的工作负载生成的负载通道,动态监测工作负载下所有实例的地址变化,并自动更新到负载通道中。 支持通过CCE工作负载标签配置进行灰度发布,完成灰度测试与版本切换。 提供多种认证方式,增加访问安全性。 提供访问流量控制策略,增加后端服务的安全性。 与直接访问容器应用相比,API网关提供流量控制,确保后端服务稳定运行。 支持多实例负载均衡,合理利用资源,增加系统可靠性。
  • 应用场景 云容器引擎(Cloud Container Engine,即CCE)中的工作负载,以及微服务,可通过API网关将服务能力以API形式对外开放。 开放CCE工作负载支持以下两种方式,推荐使用方式一直接创建负载通道的方式开放CCE工作负载。 方式一 在API网关中直接创建负载通道,通过负载通道访问CCE工作负载中的实例地址,动态监测工作负载下实例IP地址变化。开放API时使用负载通道访问后端服务,通过API的形式将云容器应用的服务能力开放出来。 方式二 一键式导入CCE工作负载,自动生成API和负载通道,API与相应生成的负载通道绑定,动态监测工作负载下实例IP地址变化。通过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。 创建ECS 选择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)
  • 添加签名信息到请求头 在计算签名后,将它添加到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签名认证流程 客户端涉及的AK/SK签名以及请求发送的流程概述如下: 构造规范请求。 将待发送的请求内容按照与API网关后台约定的规则组装,确保客户端签名、API网关后台认证时使用的请求内容一致。 使用规范请求和其他信息创建待签字符串。 使用AK/SK和待签字符串计算签名。 将生成的签名信息作为请求消息头添加到HTTP请求中,或者作为查询字符串参数添加到HTTP请求中。 本章节主要用于帮助用户自行完成API请求的签名。 签名SDK与demo章节提供了常用语言的签名SDK以及demo,与本章节提供的算法逻辑一致,您可以直接使用,省去自签名步骤。 父主题: AK/SK签名认证算法详解
  • 获取SDK 点此下载SDK与Demo。 解压后目录结构如下: 名称 说明 libs\java-sdk-core-x.x.x.jar 签名SDK pom.xml 构建Maven工程所需,定义其他依赖包 changelog 变更日志 src 验证签名SDK的demo代码: WebSocketDemo.java OkHttpDemo.java、 LargeFileUploadDemo.java HttpClientDemo.java 引用类: Constant.java SSLCipherSuiteUtil.java UnsupportProtocolException.java
  • API调用 示例代码修改调用环境信息后可直接调用。以下以新建工程为例,介绍如何在您的应用中调用SDK进行请求签名。 把API信息替换到HttpClientDemo.java中对应位置。 本示例以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 把API信息和已设置的环境变量替换到HttpClientDemo.java中对应位置。 HttpClientDemo中引用以下类,可在“获取SDK”包中的“src”文件下查看: Constant:demo中用到的常量。 SSLCipherSuiteUtil:tls认证配置参数的工具类,比如配置客户端不校验证书。 UnsupportProtocolException:异常处理类。 public class HttpClientDemo { private static final Logger LOG GER = LoggerFactory.getLogger(HttpClientDemo.class); public static void main(String[] args) throws Exception { // Create a new request. Request httpClientRequest = new Request(); try { // Set the request parameters. // AppKey, AppSecrect, Method and Url are required parameters. // 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. httpClientRequest.setKey(System.getenv("HUAWEICLOUD_SDK_AK")); httpClientRequest.setSecret(System.getenv("HUAWEICLOUD_SDK_SK")); httpClientRequest.setMethod("POST"); // Set a request URL in the format of https://{Endpoint}/{URI}. httpClientRequest.setUrl("put your request url here"); httpClientRequest.addHeader("Content-Type", "text/plain"); // Set a body for http request. httpClientRequest.setBody("put your request body here"); } catch (Exception e) { LOGGER.error(e.getMessage()); return; } CloseableHttpClient client = null; try { // Sign the request. HttpRequestBase signedRequest = Client.sign(httpClientRequest, Constant.SIGNATURE_ALGORITHM_SDK_HMAC_SHA256); if (Constant.DO_VERIFY) { // creat httpClient and verify ssl certificate HostName.setUrlHostName(httpClientRequest.getHost()); client = (CloseableHttpClient) SSLCipherSuiteUtil.createHttpClientWithVerify(Constant.INTERNATIONAL_PROTOCOL); } else { // creat httpClient and do not verify ssl certificate client = (CloseableHttpClient) SSLCipherSuiteUtil.createHttpClient(Constant.INTERNATIONAL_PROTOCOL); } HttpResponse response = client.execute(signedRequest); // Print the body of the response. HttpEntity resEntity = response.getEntity(); if (resEntity != null) { LOGGER.info("Processing Body with name: {} and value: {}", System.getProperty("line.separator"), EntityUtils.toString(resEntity, "UTF-8")); } } catch (Exception e) { LOGGER.error(e.getMessage()); } finally { if (client != null) { client.close(); } } }} 运行HttpClientDemo.java,对请求进行签名、访问API并打印结果。 示例结果如下: [main] INFO com.huawei.apig.sdk.demo.HttpClientDemo - Print the authorization: [Authorization: SDK-HMAC-SHA256 Access=3afe***ba29, SignedHeaders=host;x-sdk-date, Signature=26b2***dbf6][main] INFO com.huawei.apig.sdk.demo.HttpClientDemo - Print the status line of the response: HTTP/1.1 200 OK[main] INFO com.huawei.apig.sdk.demo.HttpClientDemo - Processing Header with name: Date and value: Fri, 26 Aug 2022 08:58:51 GMT[main] INFO com.huawei.apig.sdk.demo.HttpClientDemo - Processing Header with name: Content-Type and value: application/json[main] INFO com.huawei.apig.sdk.demo.HttpClientDemo - Processing Header with name: Transfer-Encoding and value: chunked[main] INFO com.huawei.apig.sdk.demo.HttpClientDemo - Processing Header with name: Connection and value: keep-alive[main] INFO com.huawei.apig.sdk.demo.HttpClientDemo - Processing Header with name: Server and value: api-gateway[main] INFO com.huawei.apig.sdk.demo.HttpClientDemo - Processing Header with name: X-Request-Id and value: 10955c5346b9512d23f3fd4c1bf2d181[main] INFO com.huawei.apig.sdk.demo.HttpClientDemo - Processing Body with name: and value: {"200": "sdk success"} 显示{"200": "sdk success"},表示签名成功,API成功请求到后端。 如果改变AK或SK的值,API网关将返回的错误信息error_msg。
  • 错误码说明 当您使用各云服务的API时,如果遇到“APIGW”开头的错误码,请参考如下语义与解决方案进行处理。 表1 错误码 错误码 错误信息 HTTP状态码 语义 解决方案 APIGW.0101 The API does not exist or has not been published in the environment. 404 API不存在或未发布到环境 请参考"The API does not exist or has not been published in the environment."如何解决?处理 APIGW.0101 The API does not exist. 404 API请求方法不存在 检查API请求方法是否与API定义的方法相同 APIGW.0103 The backend does not exist. 404 无法找到后端 联系技术支持 APIGW.0104 The plug-ins do not exist. 400 无法找到插件配置 联系技术支持 APIGW.0105 The backend configurations do not exist. 400 无法找到后端配置 联系技术支持 APIGW.0106 Orchestration error. 400 编排错误 检查API配置的前后端参数是否合理 APIGW.0201 API request error. 400 请求格式不合法 使用合法的请求 APIGW.0201 Request entity too large. 413 请求body过大(大于12M) 减小请求body大小 APIGW.0201 Request URI too large. 414 请求URI过大 减小请求URI大小 APIGW.0201 Request headers too large. 494 请求头过大 减小请求头大小 APIGW.0201 Backend unavailable. 502 后端不可用 检查API配置的后端地址是否可用 APIGW.0201 Backend timeout. 504 后端超时 增大超时时间或缩小后端的处理时间 APIGW.0301 Incorrect IAM authentication information. 401 IAM认证信息错误 请参考IAM认证信息错误处理 APIGW.0302 The IAM user is not authorized to access the API. 403 IAM用户不允许访问API 检查用户是否被黑/白名单限制 APIGW.0303 Incorrect app authentication information. 401 APP认证信息错误 APP签名认证时,做如下检查: 检查请求的方法、路径、查询参数、请求体和签名使用的方法、路径、查询参数、请求体是否一致 检查客户端机器时间是否正确 请参考使用APP认证调用API检查签名代码的问题。 APPCODE简易认证时,做如下检查:检查请求是否携带了X-Apig-AppCode头域 APIGW.0304 The app is not authorized to access the API. 403 APP不允许访问API 检查APP是否授权访问API APIGW.0305 Incorrect authentication information. 401 认证信息错误 检查认证信息是否正确 APIGW.0306 API access denied. 403 不允许访问API 检查是否授权访问API APIGW.0307 The token must be updated. 401 Token需要更新 重新从IAM服务 获取Token 也有可能是调用了不同region的接口,导致判断为Token失效,建议检查接口URL APIGW.0308 The throttling threshold has been reached. 429 超出流控值限制 等待流控刷新后访问。默认每个API每秒最多访问200次 云服务开放的API,一般无法调整限额,请等待流控刷新后访问 您在API网关服务中自行创建API,如需调整限额,请提工单联系技术支持 APIGW.0310 The project is unavailable. 403 project不可使用 使用其他project访问 APIGW.0311 Incorrect debugging authentication information. 401 调试认证信息错误 联系技术支持 APIGW.0401 Unknown client IP address. 403 无法识别客户端IP地址 联系技术支持 APIGW.0402 The IP address is not authorized to access the API. 403 IP地址不允许访问 检查IP地址是否被黑/白名单限制 APIGW.0404 Access to the backend IP address has been denied. 403 后端IP不允许访问 后端IP地址或后端域名对应的IP地址不允许访问,请检查IP地址是否被黑/白名单限制,或检查对应后端IP是否存在。 APIGW.0501 The app quota has been used up. 405 APP已经超出配额 购买APP配额 APIGW.0502 The app has been frozen. 405 APP被冻结 余额不足,请前往“资金管理”充值。 APIGW.0601 Internal server error. 500 内部错误 联系技术支持 APIGW.0602 Bad request. 400 非法请求 检查请求是否合法 APIGW.0605 Domain name resolution failed. 500 域名解析失败 检查域名拼写,以及域名是否绑定了正确的后端地址 APIGW.0606 Failed to load the API configurations. 500 未加载API配置 联系技术支持 APIGW.0607 The following protocol is supported: {xxx} 400 协议不被允许,允许的协议是xxx 注意:xxx以实际响应中的内容为准 改用支持的协议(HTTP/HTTPS)访问 APIGW.0608 Failed to obtain the admin token. 500 无法获取管理租户 联系技术支持 APIGW.0609 The VPC backend does not exist. 500 找不到vpc后端 联系技术支持 APIGW.0610 No backend available. 502 没有可连接的后端 检查所有后端是否可用 APIGW.0611 The backend port does not exist. 500 后端端口未找到 联系技术支持 APIGW.0612 An API cannot call itself. 500 API调用自身 修改API后端配置,递归调用层数不能超过10层 APIGW.0613 The IAM service is currently unavailable. 503 IAM服务暂时不可用 联系技术支持 APIGW.0705 Backend signature calculation failed. 500 计算后端签名失败 联系技术支持 APIGW.0801 The service is unavailable in the currently selected region. 403 服务在当前region不可访问 检查所访问的服务是否支持跨region访问 APIGW.0802 The IAM user is forbidden in the currently selected region. 403 该IAM用户在当前region中被禁用 联系技术支持
  • 构造规范请求 使用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"}
共99316条