我已經從IE 8和9獲得AmazonAWS Kinesis分析的有趣(並且理論上不可能)的任務。根據亞馬遜自己的SDK,這是不可能的,因爲XDomainRequest
不允許自定義標題。然而,與此相反,AmazonAWS allows you to authenticate using query string parameters。我的目標是爲XMLHttpRequest
編寫墊片,它利用XDomainRequest
對象並將所有Amazon標題轉換爲查詢字符串參數。使用查詢字符串驗證發佈到AmazonAWS Kinesis流
實際的實現結果比我想象的要困難得多。由於Amazon的查詢字符串驗證僅使用SignedHeaders
的「主機」(而AmazonAWS SDK試圖使用主機,日期和目標),所以我不得不重新計算簽名。這意味着CryptoJS和大量的實驗,讓一切工作。
4小時接收「計算出的簽名不匹配」之後,我終於開始得到一個不同的錯誤代碼:Unable to determine service/operation name to be authorized
谷歌搜索這個錯誤was not very helpful:從一個錯字什麼額外的新行字符使用日期戳而不是版本號。不過,我試過一切並沒有什麼幫助。
下面是一個例子捲曲請求和返回值:
curl -H "Content-Type:text/plain" --data "{\"Data\":\"VALID BASE64 DATA\",\"PartitionKey\":\"PARTITION\",\"StreamName\":\"STREAM\"}" "https://kinesis.us-east-1.amazonaws.com/?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAJMAGAYBGGRNZQI4A/20140723/us-east-1/kinesis/aws4_request&X-Amz-Date=20140723T153144Z&X-Amz-SignedHeaders=host&X-Amz-Target=Kinesis_20131202.PutRecord&X-Amz-User-Agent=aws-sdk-js/2.0.0&X-Amz-Signature=VALID_SIGNATURE"
返回:
<AccessDeniedException>
<Message>Unable to determine service/operation name to be authorized</Message>
</AccessDeniedException>
我試過追加Action
和Version
參數(注意the Version
should be in YYYY-MM-DD format as opposed to YYYYMMDD),這沒有幫幫我。我也嘗試轉義我的所有/
字符或轉義我的所有.
字符(或兩者)。
爲了便於比較,這裏是通過谷歌瀏覽器使用頭,而不是查詢字符串相同的請求:
Remote Address:176.32.102.203:443
Request URL:https://kinesis.us-east-1.amazonaws.com/
Request Method:POST
Status Code:200 OK
Request Headers
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Authorization:AWS4-HMAC-SHA256 Credential=AKIAJMAGAYBGGRNZQI4A/20140723/us-east-1/kinesis/aws4_request, SignedHeaders=host;x-amz-date;x-amz-target, Signature=OMITTED
Cache-Control:no-cache
Connection:keep-alive
Content-Length:3236
Content-Type:application/x-amz-json-1.1
Host:kinesis.us-east-1.amazonaws.com
Origin:OMITTED
Pragma:no-cache
Referer:OMITTED
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
X-Amz-Date:20140723T145554Z
X-Amz-Target:Kinesis_20131202.PutRecord
X-Amz-User-Agent:aws-sdk-js/2.0.0
Request Payload
OMITTED (because it's long)
響應:
{"SequenceNumber":"49540780386103606919741841581837328106424971136629473281","ShardId":"shardId-000000000000"}
有誰知道我做錯了,爲什麼我無法與Kinesis溝通?
看起來您的X-Amz-Signed-Headers = host表示您未簽署足夠的「頭文件「 - 查詢字符串參數,在這種情況下,至少是X-Amz-Target和X-Amz-Date。 –
根據[亞馬遜自己的文檔](http://docs.aws.amazon.com/general/latest/gr/sigv4-signed-request-examples.html#sig-v4-examples-get-query-string), '對於使用查詢字符串的請求,只有「主機」包含在簽名標題中。'(這是Python代碼中「步驟3」後不久的註釋) – stevendesu
好點,但也要注意你引用的文檔表明它們是'GET'(而不是'POST')。嘗試將curl Content-Type標頭設置爲application/x-amz-json-1.1(如果沒有)。 Kinesis似乎對文本/純文本的反應不同。除此之外,計劃B將把您的請求發送到您的應用程序服務器並將其代理到kinesis。 –