2016-09-30 2 views
0

Ich versuche, eine Anfrage gegen die Azure-Speicher-API an ein Konto zu richten, das nicht öffentlich sichtbar ist und Anforderungen benötigt, um authentifiziert zu werden.Verwenden von Azure Blob-Speicher-REST-API mit https

Ich habe versucht, diese Seite für die Header zu folgen: https://msdn.microsoft.com/en-us/library/azure/dd179428.aspx

Ich kann einfach nicht diese Arbeit machen. Ich erhalte immer einen "ResourceNotFound" -Fehler, den ich nicht erklären kann, da ich auf keinen Fall das Speicherkonto oder die Containernamen falsch beschreibe. Ich bin auch erfolgreich mit Power BI verbunden, indem ich denselben Account, denselben Container und denselben Schlüssel verwende.

Das einzige, was ich denken kann, könnte mit der Generierung der Signatur sein, könnte ich in den Codierungen verloren gehen (das erste Mal mache ich so etwas) .. Das erklärt jedoch nicht die Fehlermeldung "Ressource nicht gefunden". Hier ist der Code für die Anfrage (R):

#azure storage endpoint to hit against 
account <- "myaccount" 
container <- "mycontainer" 
requestProperties <- "comp=list" 
endPoint <- paste("https://", account, ".blob.core.windows.net/", sep = "") 
endPoint 
#[1] "https://myaccount.blob.core.windows.net/" 


#date header 
timeStamp <- Sys.time() 
timeString <- format(timeStamp, format="%y-%m-%d %H:%M:%S", tz="GMT", usetz = TRUE) 
timeString <- "Fri, 30 Sep 2016 14:54:30 GMT" 
dateHeader <- paste("x-ms-date", timeString, sep = ":") 
dateHeader 
#[1] "x-ms-date:Fri, 30 Sep 2016 14:54:30 GMT" 

#version header 
versionHeader <- "x-ms-version:2015-02-21" 

#authorization header 
requestVerb <- "GET" 
authType <- "SharedKey" 
azureKey <- "myAccountKey" 

newLines <- "\n\n\n\n\n\n\n\n\n\n" 
canonicalizedHeaders <- paste(dateHeader,versionHeader, sep = "\n") 

#build canonicalized resource 
resourceAccount <- paste("/",account, sep = "") 
resourceContainer <- paste ("/",container, sep = "") 
resource <- paste(resourceAccount, resourceContainer, sep = " ") 

canonicalizedResource <- paste(resource, requestProperties, sep = "\n") 
canonicalizedResource 
#[1] "/myaccount /mycontainer\ncomp=list" 

#build authentication signed string 
stringToSign <- paste(requestVerb, newLines, canonicalizedHeaders, canonicalizedResource, sep = "\n") 
stringToSign <- enc2utf8(stringToSign) 
stringToSign 
#[1] "GET\n\n\n\n\n\n\n\n\n\n\n\nx-ms-date:Fri, 30 Sep 2016 14:54:30 GMT\nx-ms-version:2015-02-21\n/myaccount /mycontainer\ncomp=list" 

Signature <- digest::hmac(object = stringToSign, key = azureKey, algo = "sha256", serialize = FALSE) 

#authentication header 
authorization <- paste(account, Signature, sep = ":") 
authorization 
#[1] "myaccount:b4761595ea09d0e9d56223bd0a14233bca2b9fc3bb043031586215942f5c6d06" 

authHeader <- paste("Authorization:", authType, authorization, sep = " ") 
authHeader 
#[1] "Authorization: SharedKey myaccount:b4761595ea09d0e9d56223bd0a14233bca2b9fc3bb043031586215942f5c6d06" 


#build the actual request 
request <- paste(endPoint, requestProperties, sep = "?") 
request 
#[1] "https://myaccount.blob.core.windows.net/?comp=list" 

azureRequest <- httr::GET(request, httr::add_headers(dateHeader, versionHeader, authHeader)) 
responseContent <- httr::content(azureRequest, as = "text") 
responseContent 
#[1] "<?xml version=\"1.0\" encoding=\"utf-8\"?><Error><Code>ResourceNotFound</Code><Message>The specified resource does not exist.\nRequestId:b1e87500-0001-0003-6231-1b7598000000\nTime:2016-09-30T15:44:52.3452448Z</Message></Error>" 

Fehle ich etwas beim Generieren der Anfrage? Muss ich etwas mit meinem Konto tun, um den Zugriff über die REST-API zu ermöglichen?

+0

So stellt MS kein Dummy-Konto mit öffentlich verfügbaren Authentifizierungsschlüsseln zu Demonstrationszwecken zur Verfügung? Andernfalls sollten Sie nur in ein Azure-spezifisches Forum gehen, da der Rest der US-Azure-Benutzer keine Antworten testen kann. –

+0

Ich hoffe, das ist nicht Ihre echte SharedKey – Paparazzi

+0

Versuchen Sie, den Container in den Pfad zu setzen. z.B. http: // .blob.core.windows.net/mycontainer – Paparazzi

Antwort

0

Gibt es einen Grund, warum Sie nicht die Storage SDKs verwenden, die diese Logik für Sie ausführen? Wir haben sie in allen wichtigen Sprachen - siehe die Liste der Registerkarten oben in diesem Getting Started Handbuch. Alternativ haben wir den gesamten Quellcode für diese Bibliotheken auf GitHub verfügbar (zB - hier ist die. NET source code) und Sie können die Signierungslogik im Quellcode sehen - überprüfen SharedAccessSignatureHelper für SAS-Token (here).

+0

Ich wollte das in R machen, da ich Daten in Power BI bringe, das direkt in R integriert ist. Sobald ich etwas Zeit habe, um es mir noch einmal anzusehen, gehe ich die Links durch, die Sie und Gunjan geteilt haben, um zu sehen, ob sie mir helfen können. Vielen Dank – Zepee

Verwandte Themen