2016-08-09 7 views
0

Azure Storage REST API에 대한 첫 번째 호출을 하루 종일 계속했습니다. 우편 배달부의 답변에 따르면 Azure 인증의 오류로 인한 것이지만 문제가 무엇인지 전혀 알지 못합니다. 여기 Azure 스토리지 서비스 REST API 인증

는 푸른 저장 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 개발자 도구 없음 '액세스 제어는-원점 허용'더 이유없이 헤더, 그래서 나는 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> 

두 문자열을 diff를 후를, 내 스크립트에 var strToSign 믿지는 푸른 서명하는 데 사용되는 문자열과 동일합니다. 하지만 여전히 인증 오류가있었습니다. 문제가 무엇인지 알려주십시오.

답변

3

Chrome 개발자 도구는 없음 '액세스 제어 - 허용 - 원산지'헤더는 클라이언트에서 직접 애저 스토리지 서버에 대해 HTTP 요청을 보내 자바 스크립트를 사용하는 것처럼

돌아왔다. 일반적인 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 토큰으로 인증했다.

여기에 참고로, 내 테스트 코드입니다.,

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; 

은 또한, 보안 이유로, 백엔드 웹 서버에 푸른 스토리지 서비스를 구현하시기 바랍니다. 클라이언트에서 순수한 자바 스크립트를 사용하면 계정 이름과 계정 키가 공개되어 데이터 및 정보의 위험이 높아집니다.

+0

내 생명을 구 해주셔서 감사합니다, 게리! 멍청한 놈으로 [이 인증 문서] (https://msdn.microsoft.com/en-us/library/azure/dd179428.aspx)에서 직접 온 것은 기본 64 디코드가 필요하다는 것을 몰랐습니다. 가능한 경우 다른 사람들이 빠른 시작을 위해 샘플 코드 스 니펫을 문서에 추가하십시오. :-) – Ernie

+0

또한 SharedKeyLite도 작동합니다! – Ernie

+0

그 이야기를 듣고 기쁩니다. –

관련 문제