2016-08-09 2 views
0

Я застрял весь день, сделав свой первый вызов API REST Azure Storage. Ответ Postman показал, что это связано с ошибкой в ​​аутентификации Azure, но я не знаю, в чем проблема.Авторизация службы хранения Azure REST API

Вот браузер скрипт для отправки Azure Storage 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); 
    } 
}); 
} 

Chrome Developer Tool только что вернулся Нет 'Access-Control-Allow-Origin' заголовок без дополнительной причины, поэтому я скопировал содержимое 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> 

После дифф двух строк, я считаю var strToSign в моем сценарии такое же, как строка Azure используется для подписания. Но все же произошла ошибка аутентификации. Пожалуйста, помогите указать, в чем проблема.

ответ

3

Chrome Developer Tool только что вернулся Нет 'Access-Control-Allow-Origin' заголовок

Как вы используете JavaScript для отправки запросов HTTP в отношении к Azure Storage Server непосредственно от клиента. Это общая проблема CORS.

При возникновении этой проблемы вы можете enable the CORS for your storage services. Для простоты вы можете использовать Microsoft Azure Storage Explorer для настройки вашего хранилища.

enter image description here

AuthenticationFailed

Я сделал две модификации основаны на фрагмент кода, в моем тестовом проекте, чтобы сделать его работу.

  1. var hash = CryptoJS.HmacSHA256(strToSign, key); Второй параметр должен быть 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; 

Кроме того, в целях безопасности, пожалуйста, реализовать Azure Services хранения в веб-внутренний сервер. Как использование чистого javascript на клиенте, вы откроете для своей учетной записи имя и ключ учетной записи, что повысит риск для ваших данных и информации.

+0

Спасибо, что спасли мне жизнь, Гэри! Как noob и пришел непосредственно из [этого документа аутентификации] (https://msdn.microsoft.com/en-us/library/azure/dd179428.aspx), я не знал, что сначала необходимо сначала декодировать ключ base64. Если возможно, добавьте образец кода в документ для других, чтобы быстро начать. :-) – Ernie

+0

BTW, SharedKeyLite также работает! – Ernie

+0

Рад это услышать. –