云服务器内容精选
-
准备环境 获取并安装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插件,如下图所示。
-
获取SDK 点此下载SDK与Demo。 解压后目录结构如下: 名称 说明 apigateway-signature\Signer.cs SDK代码 apigateway-signature\HttpEncoder.cs sdk-request\Program.cs 签名请求示例代码 csharp.sln 工程文件 licenses\license-referencesource 第三方库license文件
-
请求签名与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只包含签名功能,不包含云服务的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 示例代码
-
请求签名与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)
-
准备环境 获取并安装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插件,如下图所示。
-
AK/SK签名认证流程 客户端涉及的AK/SK签名以及请求发送的流程概述如下: 构造规范请求。 将待发送的请求内容按照与API网关后台约定的规则组装,确保客户端签名、API网关后台认证时使用的请求内容一致。 使用规范请求和其他信息创建待签字符串。 使用AK/SK和待签字符串计算签名。 将生成的签名信息作为请求消息头添加到HTTP请求中,或者作为查询字符串参数添加到HTTP请求中。 本章节主要用于帮助用户自行完成API请求的签名。 签名SDK与demo章节提供了常用语言的签名SDK以及demo,与本章节提供的算法逻辑一致,您可以直接使用,省去自签名步骤。 父主题: 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网关将拒绝请求。
-
添加签名信息到请求头 在计算签名后,将它添加到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签名认证算法详解
-
获取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......");... 父主题: 常见问题
更多精彩内容
CDN加速
GaussDB
文字转换成语音
免费的服务器
如何创建网站
域名网站购买
私有云桌面
云主机哪个好
域名怎么备案
手机云电脑
SSL证书申请
云点播服务器
免费OCR是什么
电脑云桌面
域名备案怎么弄
语音转文字
文字图片识别
云桌面是什么
网址安全检测
网站建设搭建
国外CDN加速
SSL免费证书申请
短信批量发送
图片OCR识别
云数据库MySQL
个人域名购买
录音转文字
扫描图片识别文字
OCR图片识别
行驶证识别
虚拟电话号码
电话呼叫中心软件
怎么制作一个网站
Email注册网站
华为VNC
图像文字识别
企业网站制作
个人网站搭建
华为云计算
免费租用云托管
云桌面云服务器
ocr文字识别免费版
HTTPS证书申请
图片文字识别转换
国外域名注册商
使用免费虚拟主机
云电脑主机多少钱
鲲鹏云手机
短信验证码平台
OCR图片文字识别
SSL证书是什么
申请企业邮箱步骤
免费的企业用邮箱
云免流搭建教程
域名价格