【问题标题】:Azure storage authorization failed or format is wrongAzure 存储授权失败或格式错误
【发布时间】:2017-06-08 22:30:14
【问题描述】:

大家好,我受困于 Azure 存储授权。当我只上传一个文件(blob)时,我将 SAS 密钥放在 url 中,一切正常。但是当我需要在 BLOB 服务中创建块时,创建它们时必须有授权标头(亚马逊说)。我正在尝试使用this article 创建授权。

有我的 JavaScript 代码(我使用 ng-file-uploader 库):

    $scope.upload = function (file) {
    blockId = blockId + 1;
    Upload.upload({
        url: "https://MYSTORAGENAME.blob.core.windows.net/kont1/"+ file.name + "?comp=block&blockid=" + blockId,
        method: 'PUT',
        resumeChunkSize: '40MB', // upload in chunks of specified size
        headers: {
            'Content-type': 'multipart/form-data',
            'Authorization': 'SharedKey' + "MYSTORAGENAME:iDrJ7OuggJ8uoIn5olNDeOvSAoMrpqckl5mUaT5/H/w=",
            'x-ms-version': '2015-12-11',
            'x-ms-date': new Date().toUTCString()
            },
        data: {file: file}
    }).then(function (resp) {
        console.log('Success ' + resp.config.data.file.name + 'uploaded. Response: ' + resp.data);
    }, function (resp) {
        console.log('Error status: ' + resp.status);
    }, function (evt) {
        var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
        console.log('progress: ' + progressPercentage + '% ' + evt.config.data.file.name);
    });
};

此请求返回:400(未以正确的格式提供身份验证信息。请检查授权标头的值。)

当我尝试改变这一点时: '授权':'SharedKey' + "MYSTORAGENAME:iDrJ7OuggJ8uoIn5olNDeOvSAoMrpqckl5mUaT5/H/w="

对此: '授权': "SharedKey sand2storage:iDrJ7OuggJ8uoIn5olNDeOvSAoMrpqckl5mUaT5/H/w="

然后返回:403(服务器验证请求失败。确保Authorization标头的值格式正确,包括签名。)

我在这上面花了 2 天时间,但还是没弄好,也许有人看到了我缺少的东西?提前谢谢你。

注意:

iDrJ7OuggJ8uoIn5olNDeOvSAoMrpqckl5mUaT5/H/w=

我在 Azure 页面中生成此密钥,每次尝试确保该密钥正确。

【问题讨论】:

  • 您能分享一下您是如何计算SharedKey 值的吗?
  • 我只是从生成的“共享访问签名”中获取 sig 值。看看我在问题末尾插入的图片。
  • 我也尝试使用 azure 节点库生成它: var blobSvc = azure.createBlobService("STORAGE_NAME","ACCESS_KEY","STORAGE_NAME.blob.core.windows.net"); var startDate = new Date(); var expiryDate = new Date(startDate); expiryDate.setMinutes(startDate.getMinutes() + 800); var ap = { AccessPolicy: { Permissions: azure.BlobUtilities.SharedAccessPermissions.WRITE, Start: startDate, Expiry: expiryDate }, }; var token = blobSvc.generateSharedAccessSignature('CONTAINER_NAME', 'myblob', ap);
  • 关于如何生成共享密钥请参考这篇文章:Authentication for the Azure Storage Services
  • 感谢您的帮助。但即使我生成了密钥,我仍然遇到同样的错误。 Gaurav Mantri 解决方案在很多方面都对我有用。根据我的经验,问题可能是我是免费试用用户。

标签: javascript angularjs node.js azure storage


【解决方案1】:

如果您使用的是 Shared Access Signature (SAS),则无需指定 Authorization 标头,因为 SAS 令牌包含此值。您也不需要定义 x-ms-versionx-ms-date 标头。您需要包含的是x-ms-blob-type 请求标头并将其值设置为BlockBlob

您需要做的是获取 SAS 令牌并将其附加到您的 URL(请确保您没有在 SAS 令牌中包含 ?

假设您将来自门户的 Sas 令牌存储在名为 sasToken 的变量中,您的代码将是:

$scope.upload = function (file) {
    blockId = blockId + 1;
    Upload.upload({
        url: "https://MYSTORAGENAME.blob.core.windows.net/kont1/"+ file.name + "?comp=block&blockid=" + blockId + "&" + sasToken,
        method: 'PUT',
        resumeChunkSize: '40MB', // upload in chunks of specified size
        headers: {
            'Content-type': 'multipart/form-data',
            'Authorization': 'SharedKey' + "MYSTORAGENAME:iDrJ7OuggJ8uoIn5olNDeOvSAoMrpqckl5mUaT5/H/w=",
            'x-ms-version': '2015-12-11',
            'x-ms-date': new Date().toUTCString()
            },
        data: {file: file}
    }).then(function (resp) {
        console.log('Success ' + resp.config.data.file.name + 'uploaded. Response: ' + resp.data);
    }, function (resp) {
        console.log('Error status: ' + resp.status);
    }, function (evt) {
        var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
        console.log('progress: ' + progressPercentage + '% ' + evt.config.data.file.name);
    });
};

【讨论】:

  • 对于需要它的其他人来说还有一件事。块 id 必须是 base64 格式:)
  • 在我的情况下,我只需要设置一个标题:'x-ms-blob-type': 'Blockblob',我必须删除授权、x-ms-date 和 x-ms-version
猜你喜欢
  • 1970-01-01
  • 2021-03-26
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 2019-04-08
相关资源
最近更新 更多