PolarDB-X 1.0-API参考-1.0(2017版本)-OpenAPI使用-签名机制

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: 关于 Access Key ID 与 Access Key SecretPolarDB-X 服务会对每个 API 的调用请求进行身份验证,所以无论使用 HTTP 还是 HTTPS 协议提交请求,都需要在请求中包含由 Access Key ID 与 Access Key Secret 所产生的签名(Signature)信息。Access Key ID 和 Access Key Secret 由阿里云官方颁发给访问者(可以通过阿里云官方网站申请和管理),其中 Access Key ID 用于标识访问者的身份。Access Key Secret 是用于加密签名字符串和服务器端验证签名字符串

关于 Access Key ID 与 Access Key Secret

  • PolarDB-X 服务会对每个 API 的调用请求进行身份验证,所以无论使用 HTTP 还是 HTTPS 协议提交请求,都需要在请求中包含由 Access Key ID 与 Access Key Secret 所产生的签名(Signature)信息。
  • Access Key ID 和 Access Key Secret 由阿里云官方颁发给访问者(可以通过阿里云官方网站申请和管理),其中 Access Key ID 用于标识访问者的身份。
  • Access Key Secret 是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密,只有阿里云和用户知道。

签名方法

发送 OpenAPI 请求时,请按照下面的方法对请求进行签名处理:

  1. 使用请求参数构造规范化的请求字符串(Canonicalized Query String)。1.1. 按照参数名称的字典顺序对请求中所有的请求参数(包括文档中描述的“公共请求参数”和给定了的请求接口的自定义参数,但不能包括“公共请求参数”中提到 Signature 参数本身)进行排序。注意:使用 GET 方法提交请求时,这些参数就是请求 URI 中的参数部分(即 URI 中“?”之后由“&”连接的部分)。1.2. 对每个请求参数的名称和值进行编码。名称和值要使用 UTF-8字符集进行 URL 编码,URL 编码的编码规则是:
  • 对于字符 A-Z、a-z、0-9以及字符“-”、“_”、“.”、“~”不编码;
  • 对于其他字符编码成“%XY”的格式,其中 XY 是字符对应 ASCII 码的16进制表示。比如英文的双引号(”)对应的编码就是%22;
  • 对于扩展的 UTF-8 字符,编码成“%XY%ZA…”的格式;
  • 英文空格( )要被编码是%20,而不是加号(+)。
    注意:一般支持 URL 编码的库(比如 Java 中的 java.net.URLEncoder)都是按照“application/x-www-form-urlencoded”的 MIME 类型的规则进行编码的。实现时可以直接使用这类方式进行编码,把编码后的字符串中加号(+)替换成%20、星号(*)替换成%2A、%7E 替换回波浪号(~),即可得到上述规则描述的编码字符串。
  1. 1.3. 对编码后的参数名称和值使用英文等号(=)进行连接。
    1.4. 把英文等号连接得到的字符串按参数名称的字典顺序依次使用&符号连接,即得到规范化请求字符串。
  2. 使用上一步构造的规范化字符串按照下面的规则构造用于计算签名的字符串。
  1. StringToSign=
  2. HTTPMethod+"&"+
  3. percentEncode("/")+"&"+
  4. percentEncode(CanonicalizedQueryString)
  • 其中 HTTPMethod 是提交请求用的 HTTP 方法,比 GET。
  • percentEncode(“/”)是按照1.2中描述的 URL 编码规则对字符“/”进行编码得到的值,即“%2F”。
  • percentEncode(CanonicalizedQueryString)是对第1步中构造的规范化请求字符串按 1.2 中描述的 URL 编码规则编码后得到的字符串。
  1. 按照 RFC2104 的定义,使用上面的用于签名的字符串计算签名 HMAC 值。
    注意:计算签名时使用的 Key 就是用户持有的 Access Key Secret 并加上一个“&”字符(ASCII:38),使用的哈希算法是 SHA1。
  2. 按照 Base64 编码规则把上面的 HMAC 值编码成字符串,即得到签名值(Signature)。
  3. 将得到的签名值作为 Signature 参数添加到请求参数中,即完成对请求签名的过程。
    注意:得到的签名值在作为最后的请求参数值提交给 PolarDB-X 服务器的时候,要和其他参数一样,按照 RFC3986 的规则进行 URL 编码)。

示例

以 DescribeDrdsInstances 为例,签名前的请求参数字符串为:


  1. AccessKeyId=testid&Action=DescribeDrdsInstances&Format=XML&RegionId=cn-hangzhou&SignatureMethod=HMAC-SHA1&SignatureNonce=ae5bdbeb-9b44-40a1-8bb4-b40784bff686&SignatureVersion=1.0&Timestamp=2016-01-20T14%3A26%3A15Z&Version=2015-04-13

对这个字符串进行编码,那么 StringToSign 就是:


  1. GET&%2F&AccessKeyId%3Dtestid&Action%3DDescribeDrdsInstances&Format%3DXML&RegionId%3Dcn-hangzhou&SignatureMethod%3DHMAC-SHA1&SignatureNonce%3Dae5bdbeb-9b44-40a1-8bb4-b40784bff686&SignatureVersion%3D1.0&Timestamp%3D2016-01-20T14%253A26%253A15Z&Version%3D2015-04-13

假如使用的 Access Key ID 是“testid”,Access Key Secret 是“testsecret”,用于计算 HMAC 的 Key 就是“testsecret&”,则计算得到的签名值是:


  1. h/ka/jNO+WZv8Tqgo4a75sp6eTs=

签名后的请求 URL 为(注意增加了 Signature 参数):


  1. http://drds.aliyuncs.com/?AccessKeyId=testid&Action=DescribeDrdsInstances&Format=XML&RegionId=cn-hangzhou&SignatureMethod=HMAC-SHA1&SignatureNonce=ae5bdbeb-9b44-40a1-8bb4-b40784bff686&SignatureVersion=1.0&Timestamp=2016-01-20T14%3A26%3A15Z&Version=2015-04-13&Signature=h%2Fka%2FjNO%2BWZv8Tqgo4a75sp6eTs%3D

调用接口 DescribeDrdsInstances 的 Java 示例如下:


  1. publicstaticvoid drdsOpenAPI()throwsNoSuchAlgorithmException,InvalidKeyException,IOException{
  2.        //AK 与 SK
  3.        String accessKey ="testid";
  4.        String accessSecret ="testsecret";
  5.        //公共参数
  6.        Map<String,String> parameters =newTreeMap<String,String>();
  7.        parameters.put("Format","JSON");
  8.        parameters.put("Action","DescribeDrdsInstances");//调用 DescribeDrdsInstances 接口
  9.        parameters.put("Version","2015-04-13");
  10.        parameters.put("AccessKeyId", accessKey);
  11.        parameters.put("SignatureMethod","HMAC-SHA1");
  12.        parameters.put("Timestamp", getISO8601Time());
  13.        parameters.put("SignatureVersion","1.0");
  14.        parameters.put("SignatureNonce", UUID.randomUUID().toString());
  15.        parameters.put("RegionId","cn-hangzhou");
  16.        StringBuilder paramStr =newStringBuilder();
  17.        //拼接请求参数
  18.        for(Map.Entry<String,String> entry : parameters.entrySet()){
  19.          paramStr.append(percentEncode(entry.getKey())).append("=").append(percentEncode(entry.getValue())).append("&");
  20.        }
  21.        paramStr.deleteCharAt(paramStr.length()-1);

  22.        //计算签名
  23.        StringBuilder stringToSign =newStringBuilder();
  24.            stringToSign.append("GET").append("&").append(percentEncode("/"))
  25.                  .append("&").append(percentEncode(paramStr.toString()));
  26.            Mac mac =Mac.getInstance("HmacSHA1");
  27.        mac.init(newSecretKeySpec((accessSecret +"&").getBytes("UTF-8"),"HmacSHA1"));
  28.        byte[] signData = mac.doFinal(stringToSign.toString().getBytes("UTF-8"));
  29.        String signStr =Base64Helper.encode(signData);
  30.        //拼接 URL
  31.        String requestUrl ="http://drds.aliyuncs.com/?"+ paramStr.toString()+
  32.            "&Signature="+  percentEncode(signStr);
  33.        //准备发送 HTTP 请求
  34.        URL url =new URL(requestUrl);
  35.        HttpURLConnection httpConn =(HttpURLConnection)url.openConnection();
  36.        httpConn.setRequestMethod("GET");
  37.        httpConn.setDoOutput(true);
  38.        httpConn.setDoInput(true);
  39.        httpConn.setUseCaches(false);
  40.        httpConn.connect();
  41.        InputStream content = httpConn.getInputStream();
  42.        ByteArrayOutputStream outputStream =newByteArrayOutputStream();
  43.        byte[] buff =newbyte[1024];
  44.        while(true){
  45.           finalint read = content.read(buff);
  46.           if(read ==-1)break;
  47.           outputStream.write(buff,0,read);
  48.        }
  49.        System.out.println(newString(outputStream.toByteArray()));;
  50.  }

  51.  publicstaticString percentEncode(String value)throwsUnsupportedEncodingException{
  52.        return value !=null?URLEncoder.encode(value,"UTF-8").replace("+","%20")
  53.                .replace("*","%2A").replace("%7E","~"):null;
  54.    }

  55.  staticString getISO8601Time(){
  56.        SimpleDateFormat df =newSimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
  57.        df.setTimeZone(newSimpleTimeZone(0,"GMT"));
  58.        return df.format(newDate());
  59.  }
  60. }
相关文章
|
5月前
|
JSON API 数据格式
淘宝商品评论API接口,json数据示例参考
淘宝开放平台提供了多种API接口来获取商品评论数据,其中taobao.item.reviews.get是一个常用的接口,用于获取指定商品的评论信息。以下是关于该接口的详细介绍和使用方法:
|
8月前
|
XML JSON API
淘宝商品详情API的调用流程(python请求示例以及json数据示例返回参考)
JSON数据示例:需要提供一个结构化的示例,展示商品详情可能包含的字段,如商品标题、价格、库存、描述、图片链接、卖家信息等。考虑到稳定性,示例应基于淘宝开放平台的标准响应格式。
|
4月前
|
JSON 监控 API
亚马逊Amazon商品详情API接口解析,josn数据参考
亚马逊商品详情API接口助力开发者高效获取商品信息,返回结构清晰的JSON数据,涵盖价格、描述、图片等关键字段。本文详解API调用方法与JSON格式,助您快速掌握商品数据抓取技巧,提升开发效率,适用于电商、数据分析等领域。
|
9月前
|
XML 数据挖掘 API
1688商品详情数据示例参考,1688API接口系列
在成长的路上,我们都是同行者。这篇关于详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦!
|
9月前
|
自然语言处理 API 开发者
DeepSeek-Free-API:DeepSeekV3免费的api接口,需要使用api方式的同学可以参考一下这个项目,可以收藏起来试一下
嗨,大家好,我是小华同学。今天为大家介绍一个开源项目——DeepSeek V3 Free 服务。该项目基于 DeepSeek-V3 R1 大模型,提供免费、高性能的 API,支持高速流式输出、多轮对话、联网搜索和深度思考等功能。适用于智能客服、内容创作、教育辅助等场景。部署方式灵活,支持 Docker、Docker-compose、Render、Vercel 和原生部署。欢迎关注我们,获取更多优质开源项目和高效工作学习方法。
2613 15
|
10月前
|
JSON 缓存 API
解析电商商品详情API接口系列,json数据示例参考
电商商品详情API接口是电商平台的重要组成部分,提供了商品的详细信息,支持用户进行商品浏览和购买决策。通过合理的API设计和优化,可以提升系统性能和用户体验。希望本文的解析和示例能够为开发者提供参考,帮助构建高效、可靠的电商系统。
391 12
|
10月前
|
XML JSON API
淘宝商品详情(item get)API接口系列,示例说明参考
淘宝商品详情(item_get)API接口是淘宝开放平台(Taobao Open Platform)提供的一个重要接口,允许开发者通过HTTP请求获取淘宝商品的详细信息。以下是对该接口系列的示例说明参考
《阿里云产品手册2022-2023 版》——OpenAPI Explorer
《阿里云产品手册2022-2023 版》——OpenAPI Explorer
177 0
|
域名解析 JSON 网络协议
利用阿里云 OpenAPI 以及 DNS 云解析自建 DDNS 动态域名解析服务
家里闲置着一台老款的Mac mini Server,跑OS X越来越慢,索性装上了Cent OS 7,变成了一台家庭服务器,装上了Plex媒体服务器和Transmission下载服务,同时,也装上了Nginx、Mysql、MongoDB、Redis等,可以调试代码,甚至担当一些小型项目的服务器。 不过,只在家庭内网使用,功能太有限,于是接下来面临的一个问题就是内网穿透。使用过花生壳和花生棒,服务相当不稳定,而且种种受限,每要多加一个端口就要多花钱,安全性也有问题。
6165 0
利用阿里云 OpenAPI 以及 DNS 云解析自建 DDNS 动态域名解析服务
|
JSON 数据格式 Python
阿里云openapi签名实现代码(基于Python)
部分开发者在接触阿里云openAPi调用的时候,Signature的构造和生成一直都是一只拦路虎,本文中将基于Python,和点播的APi:getPlayAuth 实现签名的构造,仅供大家参考。
1947 0
阿里云openapi签名实现代码(基于Python)

相关产品

  • 云原生分布式数据库 PolarDB-X
  • 下一篇
    oss云网关配置