2014-07-23 57 views
0

我已經從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> 

我試過追加ActionVersion參數(注意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溝通?

+0

看起來您的X-Amz-Signed-Headers = host表示您未簽署足夠的「頭文件「 - 查詢字符串參數,在這種情況下,至少是X-Amz-Target和X-Amz-Date。 –

+0

根據[亞馬遜自己的文檔](http://docs.aws.amazon.com/general/latest/gr/sigv4-signed-request-examples.html#sig-v4-examples-get-query-string), '對於使用查詢字符串的請求,只有「主機」包含在簽名標題中。'(這是Python代碼中「步驟3」後不久的註釋) – stevendesu

+0

好點,但也要注意你引用的文檔表明它們是'GET'(而不是'POST')。嘗試將curl Content-Type標頭設置爲application/x-amz-json-1.1(如果沒有)。 Kinesis似乎對文本/純文本的反應不同。除此之外,計劃B將把您的請求發送到您的應用程序服務器並將其代理到kinesis。 –

回答

0

通過並清理一些從未得到答案的舊問題。

每邁克爾 - sqlbot:

B計劃就是您的請求發送到應用程序服務器和代理它KINESIS

這竟然是與室壁運動通信的唯一解決方案。設置一個代理,允許我將自定義標題作爲查詢字符串傳遞,然後重新組合併發送請求