Azure Хранение BLOB-объектов с токеном SAS - PullRequest
1 голос
/ 14 февраля 2020

Я пытаюсь загрузить файл в Azure Учетная запись хранения как Blob, и у меня есть клиент, предоставленный этим пакетом "github.com/Azure/azure-storage-blob-go/azblob". Как я видел в документации, должна быть возможность связываться с Хранилищем, используя SAS Token, создавая анонимные учетные данные с

credential := azblob.NewAnonymousCredential()
po := azblob.PipelineOptions{
    Log: pipeline.LogOptions{
        Log: func(s pipeline.LogLevel, m string) {
            log.Tracef("pipeline message: %s", m)
        },
        ShouldLog: func(level pipeline.LogLevel) bool {
            return level <= pipeline.LogError
        },
    },
}
pipeline := azblob.NewPipeline(credential, po)

Однако я не вижу опции для передачи SAS Token, которую я получаю от другого сервиса после того, как я запросил доступ.

Я также попытался сделать это «вручную», используя Azure REST API учетной записи хранения, поэтому мой URL был похож на https://servicename.blob.core.windows.net/containerID/BlobID?sasToken..., но все, что я получил, было 400, 411 и 501 HTTP-кодами в зависимости от по запросу заголовок.

Например, с

req.Header.Add("Accept", "*/*")
req.Header.Add("Accept-Language", "en-US,en;q=0.5 --compressed")
req.Header.Add("Accept-Encoding", "gzip, deflate, br")
req.Header.Add("content-type", "application/octet-stream")
req.Header.Add("x-ms-version", "2019-02-02")
req.Header.Add("x-ms-blob-type", "BlockBlob")
req.Header.Add("x-ms-client-request-id", "someID")
req.Header.Add("Connection", "keep-alive")
req.Header.Add("Content-Length", "512000")
req.Header.Add("Transfer-Encoding", "gzip, chunked, deflate")

Я получаю код 400 с

<?xml version="1.0" encoding="utf-8"?>
<Error>
    <Code>MissingRequiredHeader</Code>
        <Message>
            An HTTP header that's mandatory for this request is not specified.
            RequestId:someId
            Time:2020-02-14T13:47:58.8383371Z
        </Message>
    <HeaderName>x-ms-original-content-length</HeaderName>
</Error> 

Добавление заголовка x-ms-original-content-length ничего не меняет.

Забавно, что что это происходит только тогда, когда я пробую это в Go коде. Когда я попробовал любой REST-клиент, он работал с этими заголовками.

Подводя итог, мне нужно поместить файл в Azure Учетную запись хранения в виде большого двоичного объекта, и второе решение, которое должно просто работать, не работает, и первый не завершен, потому что я не вижу способ пройти SAS Token. Чего мне не хватает?

1 Ответ

1 голос
/ 21 февраля 2020

Таким образом, в 1-м случае проблема заключалась в том, что токен SAS нигде не передается в этом пакете. Он должен быть добавлен к URL позже во время создания URL, например:

URL, err := url.Parse(blobURL + "/" + containerName + "/" + blobName + "?token as query"

И во втором случае все было примерно Content-Length, что нельзя изменить со стороны заголовка. Он автоматически устанавливается во время http.NewRequest(...), но это должен быть один из следующих типов *bytes.Buffer, *bytes.Reader или *strings.Reader. В противном случае это 0. Однако http.NewRequest(...) принимает io.Reader в качестве тела, поэтому он будет компилироваться со всем, что реализует интерфейс io.Reader, например *os.File, но не установит Content-Length, что требуется в случае Azure Учетная запись хранения. Когда я переключился на один из трех перечисленных выше типов, он начал работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...