對於每一次HTTP或者HTTPS協議請求,我們會根據訪問中的簽名資訊驗證訪問要求者身份。具體由使用AccessKeyID和AccessKeySecret對稱式加密驗證實現。
重要 使用SDK提交請求可以免去做簽名。
步驟一:構造正常化請求字串
- 排序參數。定序以首字母順序排序,排序參數包括公用請求參數和介面自訂參數,不包括公用請求參數中的Signature參數。使用GET方法提交請求時,這些參數就是請求URL中的參數部分,即URL中
?
之後由&串連的部分。 - 編碼參數。使用UTF-8字元集按照RFC3986規則編碼請求參數和參數取值,編碼規則如下:
- 字元A~Z、a~z、0~9以及字元
-
、_
、.
、~
不編碼。 - 其它字元編碼成
%XY
的格式,其中XY
是字元對應ASCII碼的16進位。樣本:半形雙引號("
)對應%22
。 - 擴充的UTF-8字元,編碼成
%XY%ZA…
的格式。 - 空格( )編碼成
%20
,而不是加號(+
)。該編碼方式與application/x-www-form-urlencodedMIME
格式編碼演算法相似,但又有所不同。如果您使用的是Java標準庫中的java.net.URLEncoder,可以先用標準庫中percentEncode編碼,隨後將編碼後的字元中加號(+)替換為%20、星號(*)替換為%2A、%7E替換為波浪號(~),即可得到上述規則描述的編碼字串。
private static final String ENCODING = "UTF-8"; private static String percentEncode(String value) throws UnsupportedEncodingException { return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null; }
- 字元A~Z、a~z、0~9以及字元
- 使用等號(
=
)串連編碼後的請求參數和參數取值。 - 使用與號(
&
)串連編碼後的請求參數。
完成上述操作後,您就可以擷取到正常化請求字串(CanonicalizedQueryString)。
步驟二:建構簽章字串
構造待簽名字串
StringToSign
。您可以同樣使用percentEncode
處理上一步構造的正常化請求字串,規則如下:StringToSign=
HTTPMethod + "&" + //HTTPMethod:發送請求的 HTTP 方法,例如 GET。
percentEncode("/") + "&" + //percentEncode("/"):字元(/)UTF-8 編碼得到的值,即 %2F。
percentEncode(CanonicalizedQueryString) //您的正常化請求字串。
按照RFC2104的定義,計算待簽名字串
StringToSign的HMAC-SHA1
值。樣本使用的是Java Base64編碼方法。Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(StringToSign) ) )
計算簽名時,RFC2104規定的Key值是您的AccessKeySecret
並加上與號(&
),其ASCII值為38。將計算結果添加根據RFC3986Signature規則編碼後的參數到正常化請求字串URL中。
簽名計算過程樣本
以調用GetJobStatus查詢作業狀態為例。假設您獲得了AccessKeyID=xxx
以及AccessKeySecret=yyy
,簽名流程如下所示:
- 構造正常化請求字串,需要注意這裡有一個隨機字串
SignatureNonce
http://openanalytics.cn-hangzhou.aliyuncs.com/? AccessKeyId=xxx&Action=GetJobStatus&Format=JSON&JobId=MySparkJobId&SignatureMethod=HMAC- SHA1&SignatureNonce=f87701c37ad49e3153fabf78ed2ad73c&SignatureVersion=1.0&Timestamp=2020-10-27T07:32:05Z&VcName=MyCluster&Version=2018-06-19
- 構造待簽名字串。
GET&%2F&AccessKeyId=xxx&Action=GetJobStatus&Format=JSON&JobId=MySparkJobId&SignatureMethod=HMAC- SHA1&SignatureNonce=f87701c37ad49e3153fabf78ed2ad73c&SignatureVersion=1.0&Timestamp=2020-10- 27T07%3A32%3A05Z&VcName=MyCluster&Version=2018-06-19
- 計算簽名值。因為
AccessKeySecret=yyy
,用於計算的Key為yyy&
,計算得到的簽名值為DR5p4dbFur6ad****Iq8uH4sW6w=
。樣本使用的是JavaBase64編碼方法。Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(StringToSign) ) )
- 添加RFC3986規則編碼後的
Signature=DR5p4dbFur6ad****Iq8uH4sW6w%3D
到URL中。http://openanalytics.cn-hangzhou.aliyuncs.com/? AccessKeyId=xxx&Action=GetJobStatus&Format=JSON&JobId=MySparkJobId&SignatureMethod=HMAC- SHA1&SignatureNonce=f87701c37ad49e3153fabf78ed2ad73c&SignatureVersion=1.0&Timestamp=2020- 10-27T07%3A32%3A05Z&VcName=MyCluster&Version=2018-06- 19&Signature=DR5p4dbFur6ad****Iq8uH4sW6w%3D
通過以上URL,您可以使用瀏覽器、curl或者wget等工具發起HTTP請求調用。