0

Я следую этой ссылке MSDN (https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/put-block), чтобы реализовать вызов отдыха для Put Block.Реализация Путь блока лазурного отдыха api?

Я кодирую на 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. 

Я прочитал gaurav mantras post http://gauravmantri.com/2013/02/16/uploading-large-files-in-windows-azure-blob-storage-using-shared-access-signature-html-and-javascript/. Но это не работает для меня.

Есть ли что-то не так со строкой, которую я отправляю на подпись или URL или ниже заголовка httpConn Request.

НТТР Заголовок Я устанавливаю это:

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

Что такое 'authorizationHeader'. Привязываете ли вы его к знаку «Носитель:»? – yonisha

+1

У вас есть comp: block в вашей строке для подписи, но не blockid: YmxvY2stMQ ==. Кроме того, убедитесь, что в конце последнего параметра запроса в строке подписи нет новой строки. Наконец, всегда проверяйте тело ответа, когда вы получаете 403. В случае несоответствия подписи служба вернет строку, чтобы подписать ее, и вы можете сравнить ее со своим. –

+0

Вы решили эту проблему, какие-либо обновления? –

ответ

1

Как я знал, Put Block является операция против блока Blobs. Таким образом, нам не нужно указывать заголовок x-ms-blob-type. Если указать это в заголовке HTTP, вы должны следовать следующим tutorial о построении канонизированного Headers строки:

  • Получить все заголовки для ресурса, которые начинаются с х-ms-, включая x- ms-date header.

  • Преобразование каждого имени 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 будет выглядеть следующим образом:

и трафик захваченный Скрипач следующим образом:

+0

Спасибо, я был смущен, потому что в формате канонического ресурса не было упоминания о включении блокады. –

 Смежные вопросы

  • Нет связанных вопросов^_^