节点 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 blobService.generateSharedAccessSignature() 返回不正确的令牌
如何在 Azure 上部署和运行 Passport Express 节点
Azure 中托管的节点服务器上的 Websocket 失败