【问题标题】:Node azure blobService.generateSharedAccessSignature() returns an incorrect token节点 azure blobService.generateSharedAccessSignature() 返回不正确的令牌
【发布时间】:2017-10-07 00:18:31
【问题描述】:

我正在尝试使用 azure 节点 SDK 生成共享访问签名,但返回的令牌不起作用/缺少一些参数。

我正在创建令牌:

app.get('/node-api/get-azure-token', (req, res, next) => {
  var blobService = azure.createBlobService(myStorageAccount, myAccessKey);
  var container = 'my-azure-container-name';
  var startDate = new Date();
  var expiryDate = new Date(startDate);
  expiryDate.setMinutes(startDate.getMinutes() + 10);
  startDate.setMinutes(startDate.getMinutes() - 5);

  var sharedAccessPolicy = {
    AccessPolicy: {
        ServiceVersion: '2016-05-31',
        Permissions: azure.BlobUtilities.SharedAccessPermissions.READ + azure.BlobUtilities.SharedAccessPermissions.WRITE + azure.BlobUtilities.SharedAccessPermissions.DELETE + azure.BlobUtilities.SharedAccessPermissions.LIST + azure.BlobUtilities.SharedAccessPermissions.ADD + azure.BlobUtilities.SharedAccessPermissions.CREATE,
        Start: startDate,
        Expiry: expiryDate,
        Protocols: 'https,http'
    }
};

    const key = blobService.generateSharedAccessSignature(container, req.query.bloburi, sharedAccessPolicy);

    res.send(key);
});

错误“服务器未能验证请求。确保 Authorization 标头的值正确形成,包括签名。使用生成的 sas 令牌时抛出。

有人遇到过这个问题吗?

【问题讨论】:

  • 可以分享返回的共享访问签名吗?另外,您在req.query.bloburi 中发送什么?它是完整的 blob URI 吗?
  • @GauravMantri 实际上我只是想通了!我的权限顺序错误。它们需要按照此处显示的顺序排列:docs.microsoft.com/en-us/rest/api/storageservices/…。这在文档中不是很清楚!
  • 太棒了!您是否介意将其作为答案,因为它肯定会帮助其他人。
  • @GauravMantri 刚刚做到了!谢谢。

标签: javascript node.js azure azure-blob-storage


【解决方案1】:

我刚刚想通了! AccessPolicy 对象中的权限顺序需要按照此处显示的顺序:https://docs.microsoft.com/en-us/rest/api/storageservices/Constructing-a-Service-SAS?redirectedfrom=MSDN

【讨论】:

    【解决方案2】:

    我们根据我们的方便调整了您的代码并且它有效。

    我们授予 100 分钟的读取权限(我们使用它来私有化图像),我们将存储帐户名称、访问密钥和容器移动到 .env 文件内的全局变量中。

    var azure = require('azure-storage');
    
    var GetSharedAccessToken = function (blobName) {
    
    const blobService = azure.createBlobService(process.env.EXPRESS_API_AZURE_STORAGE_ACCOUNT_NAME, process.env.EXPRESS_API_AZURE_STORAGE_ACCOUNT_ACCESS_KEY);
    const containerName = process.env.EXPRESS_API_AZURE_STORAGE_CONTAINER_NAME;
    
    return new Promise((resolve, reject) => {
        try {
            var startDate = new Date();
            var expiryDate = new Date(startDate);
            expiryDate.setMinutes(startDate.getMinutes() + 100);
            startDate.setMinutes(startDate.getMinutes() - 100);
            var sharedAccessPolicy = {
                AccessPolicy: {
                    Permissions: azure.BlobUtilities.SharedAccessPermissions.READ,
                    Start: startDate,
                    Expiry: expiryDate
                }
            };
            var token = blobService.generateSharedAccessSignature(containerName, blobName, sharedAccessPolicy);
            var sasUrl = blobService.getUrl(containerName, blobName, token);
            resolve(sasUrl);
        }
        catch (error) {
            reject(error);
        }
    })}
    

    在我们的例子中,blobName 是图像在 Azure 中的路径,当用户单击其中一个时,我们会动态传递它。

    显然,请确保在“更改访问级别”中将容器的权限设置为“私人”(无匿名访问)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-16
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      相关资源
      最近更新 更多