簡體   English   中英

如何使用郵遞員調用REST API進行Azure文件存儲?

[英]How to call REST API for azure file storage using postman?

我想通過郵遞員調用與天藍色的文件存儲相關的REST API。 這是我提出要求的方式:

在此處輸入圖片說明

我正在請求列出文件存儲帳戶中的所有共享,如此處所述: https : //docs.microsoft.com/zh-cn/rest/api/storageservices/list-shares

我得到以下錯誤:

“請求中的日期標頭不正確。” 我應該做出什么改變?

編輯1:

當我以正確的格式提供日期時,出現如下錯誤:

在此處輸入圖片說明

我收到以下錯誤消息:“在HTTP請求中找到的MAC簽名”與任何計算出的簽名都不相同。服務器使用以下字符串簽名:“ GET”

如何解決呢?

使用更新的屏幕截圖,看來您的問題不再與x-ms-date有關。 出現此403錯誤的原因是標頭中的“授權”屬性,其格式為

Authorization =“ [SharedKey | SharedKeyLite] [帳戶名]:[簽名]”

您不應將Azure Portal上的訪問密鑰直接用作授權簽名部分,而應通過對UTF-8編碼使用HMAC-SHA256算法來構造它來編碼請求字符串。 格式化為

簽名= Base64的(HMAC-SHA256(UTF8(StringToSign)))

正式文件中提到的。

下面的示例Java代碼向您展示了如何構造授權的簽名部分:

String stringToSign = "GET\n" 
       + "\n" // content encoding
       + "\n" // content language
       + "\n" // content length
       + "\n" // content md5
       + "\n" // content type
       + "\n" // date
       + "\n" // if modified since
       + "\n" // if match
       + "\n" // if none match
       + "\n" // if unmodified since
       + "\n" // range
       + "x-ms-date:" + date + "\nx-ms-version:2015-02-21\n" // headers
       + "/" + <your account name> + "/"+"\ncomp:list"; // resources
       String auth = getAuthenticationString(stringToSign);

private static String getAuthenticationString(String stringToSign) throws Exception {
       Mac mac = Mac.getInstance("HmacSHA256");
       mac.init(new SecretKeySpec(Base64.decode(key), "HmacSHA256"));
       String authKey = new String(Base64.encode(mac.doFinal(stringToSign.getBytes("UTF-8"))));
       String auth = "SharedKey " + account + ":" + authKey;
       return auth;
}

代碼中的auth參數是由您上面提到的簽名生成的,然后您可以將其填寫在Authorization屬性中,然后在Postman中重新發送請求。

屏幕截圖如下: 在此處輸入圖片說明

重要的提醒:

在上面的代碼中,您不應在// resources行中錯過“ \\ ncomp:list”,否則也會返回403錯誤。 您可以在“ 構造規范化資源字符串”中找到規則。

您指向的鏈接包含以下示例:

PUT http://myaccount/mycontainer?restype=container&timeout=30 HTTP/1.1  
x-ms-version: 2015-02-21  
x-ms-date: Fri, 26 Jun 2015 23:39:12 GMT  
Authorization: SharedKey myaccount:ctzMq410TV3wS7upTBcunJTDLEJwMAZuFPfr0mrrA08=  
Content-Length: 0  

您使用的日期格式不正確:

所有經過身份驗證的請求必須包含該請求的協調世界時(UTC)時間戳。 您可以在x-ms-date標頭或標准HTTP / HTTPS Date標頭中指定時間戳。 如果在請求上指定了兩個標頭,則將x-ms-date的值用作請求的創建時間。

編輯:
在授權標頭上,鏈接中的文章中的“ Azure存儲服務身份驗證”鏈接指出以下內容:

要驗證請求,您必須使用發出請求的帳戶的密鑰對請求進行簽名,並將該簽名作為請求的一部分傳遞。

Authorization標頭的格式如下:
Authorization =“ [SharedKey | SharedKeyLite]:”
其中, SharedKeySharedKeyLite是授權方案的名稱, AccountName是請求資源的帳戶的名稱, Signature是根據請求構造並使用SHA256算法計算的基於哈希的消息身份驗證代碼(HMAC),然后通過使用Base64編碼進行編碼。

這是有關基於哈希的消息身份驗證代碼(HMAC)的更多信息

由於您評論了:

您好,金鑰與我的azure門戶帳戶的“訪問金鑰”標簽中提供的相同。 你有什么建議?

那就是問題所在。 您不應將密鑰用作郵件的Signature ,而需要根據密鑰來計算 Signature

簡而言之:

  • 使用“訪問密鑰”選項卡中的密鑰計算請求的SHA256哈希
  • Base64編碼SHA256哈希輸出
  • 使用Base64編碼的字符串作為Signature

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM