开发者社区 问答 正文

开放结构化数据服务OTS-Request签名


OTS的请求和应答是使用HTTP协议进行传递的。Request签名仅支持URI(Uniform Resource Identifier)签名一种方式,用户在任何一个Request中必须包含6个参数:APIVersion,Date,OTSAccessKeyId, SignatureMethod, SignatureVersion, Signature。

Request中的APIVersion表示目前OTS API的版本,其值只能是1。

Date参数有3种可选的形式:
1.      %a, %d %b %Y %H:%M:%S GMT (如:Mon, 3 Jan 2010 08:33:47 GMT)
2.      %A, %d-%b-%y %H:%M:%S GMT (如:Monday, 3-Jan-10 08:33:47 GMT)
3.      %a %b %d %H:%M:%S %Y(如:Mon Jan 3 08:33:47 2010)
这些时间传递的都是UTC时间。

Date所表示的时间与服务器接收到request的时间最大误差为15分钟。如果超过15分钟的时间误差则服务器端报错:OTSAuthFailed。

OTSAccessKeyId就是OTS提供的AccessID。

SignatureMethod表示计算签名的算法,目前只支持值为HmacSHA1这一种。

SignatureVersion表示计算签名算法的版本,目前只支持值为1的版本。

Signature即是对整个URL进行签名后的字符串。用于签名的字符串包括用户请求的资源名以及请求的参数。参数的名称和值经过URL encoding后,之间用’=’(等号)相隔,组成字符串并对参数名-值对按照字典序排序后,以’&’符号连接构成字符串。签名的计算方法如下:
Base64(hmac-sha1(VERB + “ ” + “KEY1=VALUE1” + “&” + “KEY2=VALUE2”, AccessKey


其中VERB表示请求的资源名,之后接参数的名称和值。

例如,用户的请求为: http://service.ots.aliyun.com/CreateTable?TableName=CapTable&PK.1.Name=PrimaryKey1&PK.1.Type=STRING&PK.2.Name=PrimaryKey2&PK.2.Type=INTEGER&View.1.Name=View1&View.1.PK.1.Name=PrimaryKey1&View.1.PK.1.Type=STRING&View.1.PK.2.Name=Column1&View.1.PK.2.Type=BOOLEAN&View.1.Column.1.Name=Column2&View.1.Column.1.Type=STRING&View.1.Column.2.Name=Column3&View.1.Column.2.Type=DOUBLE&APIVersion=1&Date=Fri%2C%2016%20Sep%202006%2018%3A07%3A20%20GMT&OTSAccessKeyId=ID1&SignatureMethod=HmacSHA1&SignatureVersion=1

那么用于签名的字符串为: “/CreateTable” + “” +“APIVersion=1” +“Date=Fri%2C%2016%20Sep%202006%2018%3A07%3A20%20GMT” +“&OTSAccessKeyId=ID1” +“&PK.1.Name=PrimaryKey1” +“&PK.1.Type=STRING” +“&PK.2.Name=PrimaryKey2” +“&PK.2.Type=INTEGER” +“&SignatureMethod=HmacSHA1” +“&SignatureVersion=1” +“&TableName=CapTable” +“&View.1.Column.1.Name=Column2” +“&View.1.Column.1.Type=STRING” +“&View.1.Column.2.Name=Column3” +“&View.1.Column.2.Type=DOUBLE” +“&View.1.Name=View1” +“&View.1.PK.1.Name=PrimaryKey1” +“&View.1.PK.1.Type=STRING” +“&View.1.PK.2.Name=Column1” +“&View.1.PK.2.Type=BOOLEAN”

最终传入的形式是(假设ID1对应的AccessKey为:KEY1,下面的签名字符串是用KEY1计算出来的): http://service.ots.aliyun.com/CreateTable?TableName=CapTable&PK.1.Name=PrimaryKey1&PK.1.Type=STRING&PK.2.Name=PrimaryKey2&PK.2.Type=INTEGER&View.1.Name=View1&View.1.PK.1.Name=PrimaryKey1&View.1.PK.1.Type=STRING&View.1.PK.2.Name=Column1&View.1.PK.2.Type=BOOLEAN&View.1.Column.1.Name=Column2&View.1.Column.1.Type=STRING&View.1.Column.2.Name=Column3&View.1.Column.2.Type=DOUBLE&APIVersion=1&Date=Fri%2C%2016%20Sep%202006%2018%3A07%3A20%20GMT&OTSAccessKeyId=ID1&SignatureMethod=HmacSHA1&SignatureVersion=1&Signature=%2FL034xFZBPO%2BNpxA%2BSufMiOt%2BKQ%3D

返回结果:如果用户AccessId不存在,则返回403 Forbidden ?如果用户的签名校验失败,则返回403 Forbidden ? 如果没有传入必要的参数,则返回400 Bad Request ? 传入请求的时间必须在OTS服务器当前时间前后的15分钟内,否则返回403 Forbidden
[backcolor=transparent]

展开
收起
云栖大讲堂 2017-10-26 10:55:14 1949 分享 版权
阿里云 AI 助理回答

在OTS(表格存储)的HTTP请求中,确保请求有效性和安全性需要遵循以下格式和规则:

  1. APIVersion: 必须设置为1,指示当前OTS API版本。

  2. Date:

    • 可采用三种时间格式之一来表示UTC时间:
      1. %a, %d %b %Y %H:%M:%S GMT(例如:Mon, 3 Jan 2010 08:33:47 GMT)
      2. %A, %d-%b-%y %H:%M:%S GMT(例如:Monday, 3-Jan-10 08:33:47 GMT)
      3. %a %b %d %H:%M:%S %Y(例如:Mon Jan 3 08:33:47 2010)
    • 服务器接收请求时,与Date所示时间的最大容许误差为15分钟,超时将导致错误OTSAuthFailed
  3. OTSAccessKeyId: 必填项,使用您的OTS AccessKey ID进行身份验证。

  4. SignatureMethod: 固定值HmacSHA1,指定签名算法为HMAC SHA1。

  5. SignatureVersion: 同样固定为1,指明签名算法版本。

  6. Signature: 签名字符串,通过对整个请求URL(包括资源名及参数)进行签名生成。具体步骤如下:

    • 将所有请求参数(包括上述提及的五个必填参数)按字典序排序。
    • 对参数名和值进行URL编码。
    • 按照"参数名=参数值"格式拼接这些编码后的参数对,各对之间以'&'分隔。
    • 使用AccessKey Secret作为密钥,通过HmacSHA1算法对上述构造的字符串计算签名。
    • 最终得到的签名结果即为Signature字段的值。

确保遵守这些规则可以正确构建请求并避免签名错误,保障与OTS服务之间的通信安全。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答