2017-07-24 2 views
3

J'ai essayé de me connecter à Azure Table Storage dans R. Google Searching n'a renvoyé rien sur les personnes utilisant R pour se connecter aux API Rest pour le stockage de table. La documentation est here. J'ai essayé de prendre un question existant sur le stockage blob pour me connecter (je ne pouvais pas me connecter à un blob même en utilisant ceci) et je l'ai retravaillé pour des requêtes de stockage de table. Ci-dessous:Connexion au stockage de table Azure dans R

library(httr) 
url <- "https://rpoc.table.core.windows.net:443/dummytable(PartitionKey='0dfe725b-bd43-4d9d-b58a-90654d1d8741',RowKey='00b7595d-97c3-4f29-93de-c1146bcd3d33')?$select=<comma-separated-property-names>" 
sak<-"u4RzASEJ3qbxSpf5VL1nY08MwRz4VKJXsyYKV2wSFlhf/1ZYV6eGkKD3UALSblXsloCs8k4lvCS6sDE9wfVIDg==" 
requestdate<- http_date(Sys.time()) 
signaturestring<-paste0("GET",paste(rep("\n",12),collapse=""), 
         "x-ms-date:",requestdate," 
         x-ms-version:2015-12-11") 

headerstuff<-add_headers(Authorization=paste0("SharedKey rpoc:", 
               RCurl::base64(digest::hmac(key=RCurl::base64Decode(sak, mode="raw"), 
                     object=enc2utf8(signaturestring), 
                     algo= "sha256", raw=TRUE))), 
         `x-ms-date`=requestdate, 
         `x-ms-version`= "2015-12-11", 
         `DataServiceVersion` = "3.0;NetFx", 
         `MaxDataServiceVersion` = "3.0;NetFx") 
content(GET(url,config = headerstuff, verbose())) 

Sortie de la console:

-> GET /dummytable(PartitionKey='0dfe725b-bd43-4d9d-b58a-90654d1d8741',RowKey='00b7595d-97c3-4f29-93de-c1146bcd3d33')?$select=<comma-separated-property-names> HTTP/1.1 
-> Host: rpoc.table.core.windows.net 
-> User-Agent: libcurl/7.53.1 r-curl/2.6 httr/1.2.1 
-> Accept-Encoding: gzip, deflate 
-> Accept: application/json, text/xml, application/xml, */* 
-> Authorization: SharedKey rpoc:nQWNoPc1l/kXydUw4rNq8MBIf/arJXkI3jZv+NttqMs= 
-> x-ms-date: Mon, 24 Jul 2017 18:49:52 GMT 
-> x-ms-version: 2015-12-11 
-> DataServiceVersion: 3.0;NetFx 
-> MaxDataServiceVersion: 3.0;NetFx 
-> 
<- HTTP/1.1 403 Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. 
<- Content-Length: 299 
<- Content-Type: application/json 
<- Server: Microsoft-HTTPAPI/2.0 
<- x-ms-request-id: 2c74433e-0002-00b3-5aad-04d4db000000 
<- Date: Mon, 24 Jul 2017 18:49:53 GMT 
<- 
$odata.error 
$odata.error$code 
[1] "AuthenticationFailed" 

$odata.error$message 
$odata.error$message$lang 
[1] "en-US" 

$odata.error$message$value 
[1] "Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.\nRequestId:2c74433e-0002-00b3-5aad-04d4db000000\nTime:2017-07-24T18:49:54.3878127Z" 

La question semble être les en-têtes d'authentification. Toute aide sur la façon dont je pourrais résoudre ce problème serait appréciée. Je suis vraiment surpris que plus de gens n'utilisent pas ATS avec R car c'est tellement polyvalent.

Répondre

0

Selon la référence REST pour l'authentification de Azure Storage basée sur votre code d'informations d'erreur &, la question AuthenticationFailed devrait être causée par la chaîne de signature incorrecte pour le tableau de service sans 12 symbole de répétition \n, qui est différent de celui Blob, file d'attente et services de fichiers. S'il vous plaît voir la référence Authentication for the Azure Storage Services attentivement pour connaître le format de différence pour le service de table, comme ci-dessous.

Tableau de service (Authentification par clé partagée)

StringToSign = VERB + "\n" + 
      Content-MD5 + "\n" + 
      Content-Type + "\n" + 
      Date + "\n" + 
      CanonicalizedResource; 

Tableau Service (authentification Lite Shared Key)

StringToSign = Date + "\n" 
      CanonicalizedResource 

Hope it helps.

0

J'ai basé ma solution dans la question blob PUT (Azure PUT Blob authentication fails in R), puis j'ai adapté pour utiliser GET au lieu de PUT et table au lieu de blob.

library(httr) 

account <- "account" 
container <- "container" 
key <- "u4RzASEJ..9wfVIDg==" 

url <- paste0("https://", account, ".table.core.windows.net/", container) 
requestdate <- format(Sys.time(),"%a, %d %b %Y %H:%M:%S %Z", tz="GMT") 
content_length <- 0 

signature_string <- paste0("GET", "\n",   # HTTP Verb 
          "\n",     # Content-MD5 
          "text/plain", "\n",  # Content-Type 
          requestdate, "\n",     # Date 
          # Here comes the Canonicalized Resource 
          "/",account, "/",container) 

headerstuff <- add_headers(Authorization=paste0("SharedKey ",account,":", 
               RCurl::base64(digest::hmac(key = 
                      RCurl::base64Decode(key, mode = "raw"), 
                      object = enc2utf8(signature_string), 
                      algo = "sha256", raw = TRUE))), 
          `x-ms-date`= requestdate, 
          `x-ms-version`= "2015-02-21", 
          `Content-Type`="text/plain") 

xml_body = content(GET(url, config = headerstuff, verbose()))