节点 azure blobService.generateSharedAccessSignature() 返回不正确的令牌

Posted

技术标签:

【中文标题】节点 azure blobService.generateSharedAccessSignature() 返回不正确的令牌【英文标题】:Node azure blobService.generateSharedAccessSignature() returns an incorrect token 【发布时间】: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 刚刚做到了!谢谢。 【参考方案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 中的路径,当用户单击其中一个时,我们会动态传递它。

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

【讨论】:

以上是关于节点 azure blobService.generateSharedAccessSignature() 返回不正确的令牌的主要内容,如果未能解决你的问题,请参考以下文章

允许访问 Azure 存储节点以选择用户?

节点 azure blobService.generateSharedAccessSignature() 返回不正确的令牌

如何在 Azure 上部署和运行 Passport Express 节点

Azure 中托管的节点服务器上的 Websocket 失败

Shell (ssh) 到 Azure AKS (Kubernetes) 群集工作节点

无法将节点项目发布到 Azure - 文件名必须少于 260 个字符