云服务器内容精选
-
准备环境 准备待用的签名密钥的Key和Secret。 已在控制台创建签名密钥,并绑定API,具体请参见创建并使用签名密钥。 下载SDK的最新版本。 获取并安装Python安装包(可使用2.7或3.X),如果未安装,请至Python官方下载页面下载。 获取并安装IntelliJ IDEA,如果未安装,请至IntelliJ IDEA官方网站下载。 已在IntelliJ IDEA中安装Python插件,如果未安装,请按照图1所示安装。 图1 安装Python插件
-
前提条件 准备待用的签名密钥的Key和Secret。 已在控制台创建签名密钥,并绑定API,具体请参见创建并使用签名密钥。 下载SDK的最新版本。 已获取apigateway-backend-signature-demo。 获取并安装IntelliJ IDEA,如果未安装,请至IntelliJ IDEA官方网站下载。 已安装Java Development Kit 1.8.111或以上版本,如果未安装,请至Oracle官方下载页面下载。
-
生成签名 生成签名的方式和APP认证相同,用AK代替APP认证中的AppKey,SK替换APP认证中的AppSecret,即可完成签名和请求。您可使用Java、Go、Python、C#、JavaScript、PHP、C++、C、Android进行签名和访问。 客户端须注意本地时间与时钟服务器的同步,避免请求消息头X-Sdk-Date的值出现较大误差。 API网关(即API管理)除了校验时间格式外,还会校验该时间值与网关收到请求的时间差,如果时间差大于15分钟,API网关将拒绝请求。
-
调用API示例 获取Token ,并设置成环境变量,Token用于后续调用其他接口鉴权。 获取用户Token,请求内容示例如下: curl -X POST https://{iam_endpoint}/v3/auth/tokens -H 'content-type: application/json' -d '{ "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "name": "{user_name}", "domain": { "name": "{user_name}" }, "password": "{password}" } } }, "scope": { "project": { "id": "{project_id}" } } } }' -vk 上述命令中,部分参数请参见以下说明进行修改,具体请参考《 统一身份认证 服务API参考》的获取用户Token接口: {iam_endpoint}请参见地区和终端节点获取。 {user_name}和{password}分别替换为连接 IAM 服务器的用户名和密码。 {project_id}为项目ID。在管理控制台,将鼠标移至用户名,在下拉列表中单击“我的凭证”,查看“项目ID”。 请求响应成功后在响应消息头中包含的“X-Subject-Token”的值即为Token值,如下图所示: 图1 从返回消息的Header中获取X-Subject-Token 使用如下命令将token设置为环境变量,方便后续事项。 export Token={X-Subject-Token} X-Subject-Token即为1.a获取到的token,命令示例如下: export Token=MIIDkg******BZQMEAgEwg 调用API,请参考认证前准备获取 域名 、请求方法和URL,并在请求消息头中增加“X-Auth-Token”,“X-Auth-Token”的取值为1中获取的Token。参数请根据实际情况填写。 curl -X 请求方法 域名+URL -H "x-auth-token: $Token" -vk
-
步骤4:添加签名信息到请求头 在计算签名后,将它添加到Authorization的HTTP消息头。Authorization消息头未包含在已签名消息头中,主要用于身份验证。 伪代码如下: Authorization header创建伪码: Authorization: algorithm Access=APP key, SignedHeaders=SignedHeaders, Signature=signature 需要注意的是算法与Access之前没有逗号,但是SignedHeaders与Signature之前需要使用逗号隔开。 得到的签名消息头为: Authorization: SDK-HMAC-SHA256 Access=FM9RLCN************NAXISK, SignedHeaders=host;x-sdk-date, Signature=01cc37e53d821da93bb7239c5b6e1640b184a748f8c20e61987b491e00b15822 得到签名消息头后,将其增加到原始HTTP请求内容中,请求将被发送给API网关,由API网关完成身份认证。身份认证通过后,该请求才会发送给后端服务进行业务处理。
-
步骤3:计算签名 将APP secret和创建的待签字符串作为加密哈希函数的输入,计算签名,将二进制值转换为十六进制表示形式。 伪代码如下: signature = HexEncode(HMAC(APP secret, string to sign)) 其中HMAC指密钥相关的哈希运算,HexEncode指转十六进制。伪代码中参数说明如表1所示。 表1 参数说明 参数名称 参数解释 APP secret 签名密钥 string to sign 创建的待签字符串 假设APP secret为FWTh5tqu2Pb9ZGt8NI09XYZti2V1LTa8useKXMD8,则计算得到的signature为: 01cc37e53d821da93bb7239c5b6e1640b184a748f8c20e61987b491e00b15822
-
步骤1:构造规范请求 使用APP方式进行签名与认证,首先需要规范请求内容,然后再进行签名。客户端与API网关使用相同的请求规范,可以确保同一个HTTP请求的前后端得到相同的签名结果,从而完成身份校验。 HTTP请求规范伪代码如下: CanonicalRequest = HTTPRequestMethod + '\n' + CanonicalURI + '\n' + CanonicalQueryString + '\n' + CanonicalHeaders + '\n' + SignedHeaders + '\n' + HexEncode(Hash(RequestPayload)) 通过以下示例来说明规范请求的构造步骤。 假设原始请求如下: GET https://c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com/app1?b=2&a=1 HTTP/1.1 Host: c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com X-Sdk-Date: 20191111T093443Z 构造HTTP请求方法(HTTPRequestMethod),以换行符结束。 HTTP请求方法,如GET、PUT、POST等。请求方法示例: GET 添加规范URI参数(CanonicalURI),以换行符结束。 释义: 规范URI,即请求资源路径,是URI的绝对路径部分的URI编码。 格式: 根据RFC 3986标准化URI路径,移除冗余和相对路径部分,路径中每个部分必须为URI编码。如果URI路径不以“/”结尾,则在尾部添加“/”。 举例: 示例中的URI:/app1,此时规范的URI编码为: GET /app1/ 计算签名时,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开头的参数名之前。 以排序后的第一个参数名开始,构造规范查询字符串。 举例: 示例中包含两个可选参数:a、b GET /app1/ a=1&b=2 添加规范消息头(CanonicalHeaders),以换行符结束。 释义: 规范消息头,即请求消息头列表。包括签名请求中的所有HTTP消息头列表。消息头必须包含X-Sdk-Date,用于校验签名时间,格式为ISO8601标准的UTC时间格式:YYYYMMDDTHHMMSSZ。如果API发布到非RELEASE环境时,需要增加自定义的环境名称。 客户端须注意本地时间与时钟服务器的同步,避免请求消息头X-Sdk-Date的值出现较大误差。 API网关除了校验时间格式外,还会校验该时间值与网关收到请求的时间差,如果时间差大于15分钟,API网关将拒绝请求。 格式: CanonicalHeaders由多个请求消息头共同组成,CanonicalHeadersEntry0 + CanonicalHeadersEntry1 + ...,其中每个请求消息头(CanonicalHeadersEntry)的格式为Lowercase(HeaderName) + ':' + Trimall(HeaderValue) + '\n' Lowercase表示将所有字符转换为小写字母的函数。 Trimall表示删除值前后的多余空格的函数。 最后一个请求消息头也会携带一个换行符。叠加规范中CanonicalHeaders自身携带的换行符,因此会出现一个空行。 消息头名称要保持唯一性,出现多个相同消息头名称时,无法完成认证。 举例: GET /app1/ a=1&b=2 host:c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com x-sdk-date:20191111T093443Z 规范消息头需要满足以下要求: 将消息头名称转换为小写形式,并删除前导空格和尾随空格。 按照字符代码对消息头名称进行升序排序。 例如原始消息头为: Host: c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com\n Content-Type: application/json;charset=utf8\n My-header1: a b c \n X-Sdk-Date:20191111T093443Z\n My-Header2: "a b c" \n 规范消息头为: content-type:application/json;charset=utf8\n host:c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com\n my-header1:a b c\n my-header2:"a b c"\n x-sdk-date:20191111T093443Z\n 添加用于签名的消息头声明(SignedHeaders),以换行符结束。 释义: 用于签名的请求消息头列表。通过添加此消息头,向API网关告知请求中哪些消息头是签名过程的一部分,以及在验证请求时API网关可以忽略哪些消息头。X-Sdk-date必须作为已签名的消息头。 格式: SignedHeaders = Lowercase(HeaderName0) + ';' + Lowercase(HeaderName1) + ";" + ... 已签名的消息头需要满足以下要求:将已签名的消息头名称转换为小写形式,按照字符代码对消息头进行排序,并使用“;”来分隔多个消息头。 Lowercase表示将所有字符转换为小写字母。 举例: 以下表示有两个消息头参与签名:host、x-sdk-date GET /app1/ a=1&b=2 host:c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com x-sdk-date:20191111T093443Z host;x-sdk-date 基于HTTP或HTTPS请求正文中的body体(RequestPayload),使用SHA-256哈希函数创建哈希值。 释义: 请求消息体。消息体需要做两层转换:HexEncode(Hash(RequestPayload)),其中Hash表示生成消息摘要的函数,当前支持SHA-256算法。HexEncode表示以小写字母形式返回摘要的Base-16编码的函数。例如,HexEncode("m") 返回值为“6d”而不是“6D”。输入的每一个字节都表示为两个十六进制字符。 计算RequestPayload的哈希值时,对于“RequestPayload==null”的场景,直接使用空字符串""来计算。 举例: 本示例为GET方法,body体为空。经过哈希处理的body(空字符串)如下: GET /app1/ a=1&b=2 host:c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com x-sdk-date:20191111T093443Z host;x-sdk-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 对构造好的规范请求进行哈希处理,算法与对RequestPayload哈希处理的算法相同。经过哈希处理的规范请求必须以小写十六进制字符串形式表示。 算法伪代码:Lowercase(HexEncode(Hash.SHA256(CanonicalRequest))) 经过哈希处理的规范请求示例: af71c5a7ef45310b8dc05ab15f7da50189ffa81a95cc284379ebaa5eb61155c0
-
步骤2:创建待签字符串 对HTTP请求进行规范并取得请求的哈希值后,将其与签名算法、签名时间一起组成待签名字符串。 StringToSign = Algorithm + \n + RequestDateTime + \n + HashedCanonicalRequest 伪代码中参数说明如下。 Algorithm 签名算法。对于SHA 256,算法为SDK-HMAC-SHA256。 RequestDateTime 请求时间戳。与请求消息头X-Sdk-Date的值相同,格式为YYYYMMDDTHHMMSSZ。 HashedCanonicalRequest 经过哈希处理的规范请求。 上述例子得到的待签字符串为: SDK-HMAC-SHA256 20191111T093443Z af71c5a7ef45310b8dc05ab15f7da50189ffa81a95cc284379ebaa5eb61155c0
-
调用API示例 使用JavaScript SDK生成curl命令。 下载JavaScript SDK的最新版本,并解压。在浏览器中打开demo.html,页面如下图所示。 填入Key、Secret、方法名、请求协议、域名和url。例如: 1 2 3 4 Key=4f5f626b-073f-402f-a1e0-e52171c6100c Secret=****** Method=POST Url=https://c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com 填入json格式的Query和Headers,填入Body。 单击“Send request”,生成curl命令。将curl命令复制到命令行,访问API。 $ curl -X POST "https://c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com/" -H "X-Sdk-Date: 20180530T115847Z" -H "Authorization: SDK-HMAC-SHA256 Access=071fe245-9cf6-4d75-822d-c29945a1e06a, SignedHeaders=host;x-sdk-date, Signature=9e5314bd156d517******dd3e5765fdde4" -d "" Congratulations, sdk demo is running SDK生成的curl命令不符合Window下cmd终端格式,请在git bash下执行生成的curl命令。
-
调用API示例 在Android工程中的“app/libs”目录下,加入SDK所需jar包。其中jar包必须包括: java-sdk-core-x.x.x.jar joda-time-2.10.jar 在“build.gradle”文件中加入okhttp库的依赖。 在“build.gradle”文件中的“dependencies”下加入“implementation 'com.squareup.okhttp3:okhttp:3.14.2'”。 dependencies { ... ... implementation 'com.squareup.okhttp3:okhttp:3.14.3' } 创建request,输入AppKey和AppSecret,并指定域名、方法名、请求uri和body。 Request request = new Request(); try { request.setKey("4f5f626b-073f-402f-a1e0-e52171c6100c"); request.setSecrect("******"); request.setMethod("POST"); request.setUrl("https://c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com/app1"); request.addQueryStringParam("name", "value"); request.addHeader("Content-Type", "text/plain"); request.setBody("demo"); } catch (Exception e) { e.printStackTrace(); return; } 对请求进行签名,生成okhttp3.Request对象来访问API。 okhttp3.Request signedRequest = Client.signOkhttp(request); OkHttpClient client = new OkHttpClient.Builder().build(); Response response = client.newCall(signedRequest).execute();
-
准备环境 已获取API的域名、请求url、请求方法、AppKey和AppSecret等信息,具体参见认证前准备。 获取并安装IntelliJ IDEA,如果未安装,请至IntelliJ IDEA官方网站下载。 获取并安装PHP安装包,如果未安装,请至PHP官方下载页面下载。 将PHP安装目录中的“php.ini-production”文件复制到“C:\windows”,改名为“php.ini”,并在文件中增加如下内容。 1 2 3 extension_dir = "php安装目录/ext" extension=openssl extension=curl 已在IntelliJ IDEA中安装PHP插件,如果未安装,请按照图1所示安装。 图1 安装PHP插件
-
调用API(Node.js)示例 在工程中引入signer.js。 var signer = require('./signer') var http = require('http') 生成一个新的Signer,填入AppKey和AppSecret。 var sig = new signer.Signer() sig.Key = "4f5f626b-073f-402f-a1e0-e52171c6100c" sig.Secret = "******" 生成一个Request对象,指定方法名、请求uri和body。 var r = new signer.HttpRequest("POST", "c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com/app1?a=1"); r.body = '{"a":1}' 给请求添加x-stage头,内容为环境名。如有需要,添加需要签名的其他头域。 r.headers = { "x-stage":"RELEASE" } 进行签名,执行此函数会生成请求参数,用于创建http(s)请求,请求参数中添加了用于签名的X-Sdk-Date头和Authorization头。 var opts = sig.Sign(r) 访问API,查看访问结果。如果使用https访问,则将“http.request”改为“https.request”。 var req=http.request(opts, function(res){ console.log(res.statusCode) res.on("data", function(chunk){ console.log(chunk.toString()) }) }) req.on("error",function(err){ console.log(err.message) }) req.write(r.body) req.end()
-
准备环境 已获取API的域名、请求url、请求方法、AppKey和AppSecret等信息,具体参见认证前准备。 获取并安装Nodejs安装包,如果未安装,请至Nodejs官方下载页面下载。 获取并安装IntelliJ IDEA,如果未安装,请至IntelliJ IDEA官方网站下载。 已在IntelliJ IDEA中安装NodeJS插件,如果未安装,请按照图1所示安装。 图1 安装NodeJS插件
-
获取SDK 下载SDK的最新版本,获取“ApiGateway-javascript-sdk.zip”压缩包,解压后目录结构如下: 名称 说明 signer.js SDK代码 node_demo.js Nodejs示例代码 demo.html 浏览器示例代码 demo_require.html 浏览器示例代码(使用require加载) test.js 测试用例 js\hmac-sha256.js 依赖库 licenses\license-crypto-js 第三方库license文件 licenses\license-node
-
获取SDK 下载SDK的最新版本,获取“ApiGateway-csharp-sdk.zip”压缩包,解压后目录结构如下: 名称 说明 apigateway-signature\Signer.cs SDK代码 apigateway-signature\HttpEncoder.cs sdk-request\Program.cs 签名请求示例代码 backend-signature\ 后端签名示例工程 csharp.sln 工程文件 licenses\license-referencesource 第三方库license文件
更多精彩内容
CDN加速
GaussDB
文字转换成语音
免费的服务器
如何创建网站
域名网站购买
私有云桌面
云主机哪个好
域名怎么备案
手机云电脑
SSL证书申请
云点播服务器
免费OCR是什么
电脑云桌面
域名备案怎么弄
语音转文字
文字图片识别
云桌面是什么
网址安全检测
网站建设搭建
国外CDN加速
SSL免费证书申请
短信批量发送
图片OCR识别
云数据库MySQL
个人域名购买
录音转文字
扫描图片识别文字
OCR图片识别
行驶证识别
虚拟电话号码
电话呼叫中心软件
怎么制作一个网站
Email注册网站
华为VNC
图像文字识别
企业网站制作
个人网站搭建
华为云计算
免费租用云托管
云桌面云服务器
ocr文字识别免费版
HTTPS证书申请
图片文字识别转换
国外域名注册商
使用免费虚拟主机
云电脑主机多少钱
鲲鹏云手机
短信验证码平台
OCR图片文字识别
SSL证书是什么
申请企业邮箱步骤
免费的企业用邮箱
云免流搭建教程
域名价格