我正在关注此MSDN参考(https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/put-block)以实现Put Block的休息调用。
我使用Java进行编码,并且在签名之前在授权字符串和URL下面形成。
PUT
364070
x-ms-blob-type:BlockBlob
x-ms-date:Fri, 20 Jan 2017 12:57:06 GMT
x-ms-version:2016-05-31
/xyz/mycontainer/imageBlock1
comp:block
sun.net.www.protocol.https.DelegateHttpsURLConnection:https://xyz.blob.core.windows.net/mycontainer/imageBlock1?comp=block&blockid=YmxvY2stMQ==
Error I am getting:
403
Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
我读了http://gauravmantri.com/2013/02/16/uploading-large-files-in-windows-azure-blob-storage-using-shared-access-signature-html-and-javascript/后的gaurav咒语。但是,它不适合我。
我发送给签名或网址的字符串是否有任何问题 在httpConn请求标题下面。
我设置的Http Header是:
httpConn.setRequestMethod("PUT");
httpConn.setRequestProperty("x-ms-blob-type", blobType);
httpConn.setRequestProperty("x-ms-date", date);
httpConn.setRequestProperty("x-ms-version", storageServiceVersion);
httpConn.setRequestProperty("Authorization", authorizationHeader);
httpConn.setRequestProperty("Content-Length",String.valueOf(blobLength) );
System.out.println(httpConn);
DataOutputStream wr = new DataOutputStream(httpConn.getOutputStream());
wr.write(bytes);
wr.flush();
wr.close();
int response = httpConn.getResponseCode();
答案 0 :(得分:1)
众所周知,Put Block是针对Block Blobs的操作。因此,我们不需要指定x-ms-blob-type
标头。如果在HTTP标头中指定了此项,则需要按照以下tutorial关于构造规范化标题字符串:
检索以 x-ms - 开头的资源的所有标头,包括x-ms-date标头。
将每个HTTP标头名称转换为小写。
按标题名称按字典顺序排序标题,按升序排列。每个标题只能在字符串中出现一次。
最后,在结果列表中的每个规范化标题中附加一个换行符。通过将此列表中的所有标题连接成一个字符串来构造CanonicalizedHeaders字符串。
因此,根据您的代码,您的canonicalized headers
字符串如下所示:
x-ms-blob-type:BlockBlob\nx-ms-date:Fri, 20 Jan 2017 12:57:06 GMT\nx-ms-version:2016-05-31\n
此外,您构建的CanonicalizedResource
不正确。根据您的代码,它应如下所示:
/{account-name}/{container-name}/{blob-name}\nblockid:{block-id}\ncomp:block
注意:有关构建Canonicalized Resource
字符串的详细信息,请参阅此官方document。
StringToSign
看起来像这样:
Fiddler捕获的流量如下: