2016-08-09 18 views
0

私はAzure Storage REST APIの最初の呼び出しを一日中続けてきました。郵便配達員の返答は、それがAzure認証のエラーによるものであることを示しましたが、何が問題なのか分かりません。ここでAzureストレージサービスREST APIの承認

AzureストレージのREST APIを送信するために、ブラウザのスクリプトです:

function azureListContainers() { 

var key = "key-copied-from-azure-storage-account"; 
var strTime = (new Date()).toUTCString(); 
var strToSign = 'GET\n\n\n\nx-ms-date:' + strTime + '\nx-ms-version:2015-12-11\n/myaccount/?comp=list'; 

var hash = CryptoJS.HmacSHA256(strToSign, key); 
var hashInBase64 = CryptoJS.enc.Base64.stringify(hash); 
var auth = "SharedKeyLite myaccount:"+hashInBase64; 

console.log(strToSign); 
console.log(auth); 
console.log(strTime); 

$.ajax({ 
    type: "GET", 
    beforeSend: function (request) 
    { 
     request.setRequestHeader("Authorization", auth); 
     request.setRequestHeader("x-ms-date", strTime); 
     request.setRequestHeader("x-ms-version", "2015-12-11"); 
    }, 
    url: "https://myaccount.blob.core.windows.net/?comp=list", 
    processData: false, 
    success: function(msg) { 
     console.log(msg); 
    } 
}); 
} 

クローム開発者用ツールは、単にさらなる理由なしいいえ「アクセス制御 - 許可 - 起源」ヘッダを返されたので、私はvar authの内容をコピーしそしてvar strTimeは、ポストマンのツールを使用して同じ要求を作成した:

[Command] 
GET https://myaccount.blob.core.windows.net/?comp=list 


[Headers] 
Authorization:SharedKeyLite myaccount:Z9/kY/D+osJHHz3is+8yJRqhj09VUlr5n+PlePUa8Lk= 
x-ms-date:Tue, 09 Aug 2016 10:30:49 GMT 
x-ms-version:2015-12-11 


[Response Body] 
<?xml version="1.0" encoding="utf-8"?> 
<Error> 
    <Code>AuthenticationFailed</Code> 
    <Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. 
RequestId:9be3d595-0001-0012-4929-f2fde2000000 
Time:2016-08-09T10:31:52.6542965Z</Message> 
    <AuthenticationErrorDetail>The MAC signature found in the HTTP request 'Z9/kY/D+osJHHz3is+8yJRqhj09VUlr5n+PlePUa8Lk=' is not the same as any computed signature. Server used following string to sign: 'GET 



x-ms-date:Tue, 09 Aug 2016 10:30:49 GMT 
x-ms-version:2015-12-11 
/myaccount/?comp=list'.</AuthenticationErrorDetail> 
</Error> 

を2つの文字列をdiffをした後、私は私のスクリプトでvar strToSignは、Azureのを署名するために使用される文字列と同じであると考えています。しかし、まだ認証エラーがありました。何が問題なのかを教えてください。

答えて

3

クローム開発ツールだけではありません「アクセス制御 - 許可 - 起源」ヘッダーは、クライアントから直接Azureストレージサーバへに対してHTTPリクエストを送信するためにJavaScriptを使用していると

戻りました。これは一般的なCORS問題です。

この問題が発生した場合は、enable the CORS for your storage servicesとなります。簡単には、Microsoft Azure Storage Explorerを活用してストレージを設定することができます。

enter image description here

は、私はそれを動作させるために私のテストプロジェクトでは、あなたのコードスニペットに基づいて2つの修正をしました

をAuthenticationFailed。

  1. var hash = CryptoJS.HmacSHA256(strToSign, key); 2番目のパラメータは、アカウントキーからbase64でデコードすることが私のテストではAzure Storage SDK for node.js
  2. を参照してください、私はあなたのシナリオが動作するようにするためにSharedKeyスキームを使用してSharedKeyトークンを使用して認証する必要がありました。ここで

FYI、私のテストコードスニペットです。、

var key = "key-copied-from-azure-storage-account"; 
var strTime = (new Date()).toUTCString(); 
var strToSign = 'GET\n\n\n\n\n\n\n\n\n\n\n\nx-ms-date:' + strTime + '\nx-ms-version:2015-12-11\n/<accountname>/\ncomp:list'; 
var secret = CryptoJS.enc.Base64.parse(key); 
var hash = CryptoJS.HmacSHA256(strToSign, secret); 
var hashInBase64 = CryptoJS.enc.Base64.stringify(hash); 
var auth = "SharedKey <accountname>:"+hashInBase64; 

また、セキュリティ上の理由のために、バックエンドWebサーバーにAzureストレージサービスを実施してください。クライアント上で純粋なjavascriptを使用すると、アカウント名とアカウントキーが一般公開され、データと情報の危険性が高まります。

+0

私の人生を保存していただきありがとうございます、ゲーリー! noobとして、[this Authentication doc](https://msdn.microsoft.com/en-us/library/azure/dd179428.aspx)から直接アクセスしましたが、まずbase64のデコードが必要であるかどうかはわかりませんでした。可能であれば、他の人がクイックスタートできるようにサンプルコードスニペットをドキュメントに追加してください。 :-) – Ernie

+0

ところで、SharedKeyLiteでも動作します! – Ernie

+0

それを聞いてうれしいです。 –