gpt4 book ai didi

Blob 存储帐户的 Azure SAS token 不起作用

转载 作者:行者123 更新时间:2023-12-03 02:20:15 31 4
gpt4 key购买 nike

更新:我已经更新了该功能以提供较宽的时间范围以避免过期。我还提供了我的帐户设置的屏幕截图,我已更新该设置以启用公共(public)访问。还包括当前的控制台结果。页面上的结果相同,图像无法打开。

async function sasKey(mediaLoc) {
try {
console.log('starting sasKey in bloboperations mediaLoc:', mediaLoc)
console.log('process.env.BLOB_CONTAINER is: ', process.env.BLOB_CONTAINER)
var storage = require("@azure/storage-blob")
const accountname = process.env.BLOB_ACCT_NAME;
console.log('accountname is: ', accountname)
const key = process.env.BLOB_KEY;
const cerds = new storage.StorageSharedKeyCredential(accountname,key);
const blobServiceClient = new storage.BlobServiceClient(`https://${accountname}.blob.core.windows.net`,cerds);
const containerName=process.env.BLOB_CONTAINER;
const client =blobServiceClient.getContainerClient(containerName)
const blobName=mediaLoc;
const blobClient = client.getBlobClient(blobName);
const checkDate = new Date();
const startDate = new Date(checkDate.valueOf() - 1200000);
const endDate = new Date(checkDate.valueOf() + 3600000);
console.log('checkDate, startDate, endDate: ', checkDate, startDate, endDate)
const blobSAS = storage.generateBlobSASQueryParameters({
containerName,
blobName,
permissions: storage.BlobSASPermissions.parse("racwd"),
startsOn: startDate,
expiresOn: endDate
},
cerds
).toString();
console.log( 'blobSAS is: ', blobSAS)
// const sasUrl= blobClient.url+"?"+encodeURIComponent(blobSAS);
const sasUrl = 'https://' + accountname + '/' + containerName + '/' + blobName + '?' + blobSAS
console.log('sasURL is: ', sasUrl);

return sasUrl
}
catch (error) {
console.log(error);
}
}

enter image description here

enter image description here

我正在尝试通过 node.js 函数从我的 Azure 存储 blob 容器获取有效的 SAS URI。我正在使用 @azure/storage-blob 库。我从 Azure 收到返回信息,但浏览器显示未授权。我已经四次检查我的帐户和 key 是否正确。这些设置正在将媒体上传到容器。

我不知道如何排除故障,因为没有任何错误消息返回到节点 api。相同的代码返回一个可从另一个 (dev) 容器运行的 URI。但是,该容器现在允许公共(public)访问。因此,无论如何,您都可以从该 blob 访问该 blob,这是有道理的。关于如何解决此问题有什么建议吗?

访问控制台生成的blob时出错:

5x6gyfbc5eo31fdf38f7fdc51ea1632857020560.png:1 获取 https://************.blob.core.windows.net/prod/5x6gyfbc5eo31fdf38f7fdc51ea1632857020560.png?sv%3D2020-06-12%26st% 3D2021- 09-28T19%253A23%253A41Z%26se%3D2021-09-28T19%253A25%253A07Z%26sr%3Db%26sp%3Dracwd%26sig%3Du6Naikn%252B825koPikqRGmiOoKMJZ5L3mfcR%252 FTCT3Uyk%253D 409(此存储帐户不允许公共(public)访问。)

生成 URI 的代码:

async function sasKey(mediaLoc) {
try {
var storage = require("@azure/storage-blob")
const accountname = process.env.BLOB_ACCT_NAME;
const key = process.env.BLOB_KEY;
const cerds = new storage.StorageSharedKeyCredential(accountname,key);
const blobServiceClient = new storage.BlobServiceClient(`https://${accountname}.blob.core.windows.net`,cerds);
const containerName=process.env.BLOB_CONTAINER;
const client =blobServiceClient.getContainerClient(containerName)
const blobName=mediaLoc;
const blobClient = client.getBlobClient(blobName);
const blobSAS = storage.generateBlobSASQueryParameters({
containerName,
blobName,
permissions: storage.BlobSASPermissions.parse("racwd"),
startsOn: new Date(),
expiresOn: new Date(new Date().valueOf() + 86400)
},
cerds).toString();
const sasUrl= blobClient.url+"?"+encodeURIComponent(blobSAS);
console.log('blobOperations.js returns blobSAS URL as: ', sasUrl);
console.log( 'blobSAS is: ', blobSAS)
return sasUrl
}
catch (error) {
console.log(error);
}

}

最佳答案

经过多次摆弄后,我想出了以下在生产和开发中都可以使用的函数。我不能 100% 确定哪些变化会产生影响,但我认为有三件事很重要。首先,乔尔·科克伦 (Joel Cochran) 在了解如何设置帐户方面提供的帮助至关重要。其次,过期时间也可能是一个问题。正如您从下面的正确代码中看到的,我的做法完全不同。但我认为最后一部分是我使用的部分:storage.generateBlobSASQueryParameters()。

async function sasKey(mediaLoc) {
if (process.env.SERVER_STATUS === 'Prod') {
activeContainer = 'prod'
} else {
activeContainer = 'dev'
}
try {
var storage = require("@azure/storage-blob")
const accountname = process.env.BLOB_ACCT_NAME;
const key = process.env.BLOB_KEY;
const cerds = new storage.StorageSharedKeyCredential(accountname,key);
const blobServiceClient = new storage.BlobServiceClient(`https://${accountname}.blob.core.windows.net`,cerds);
const containerName = activeContainer;
const client =blobServiceClient.getContainerClient(containerName)
const blobName=mediaLoc;
const blobClient = client.getBlobClient(blobName);
const checkDate = new Date();
const startDate = new Date(checkDate.valueOf() - 5*60*1000);
const endDate = new Date(checkDate.valueOf() + + 24*60*60*1000);

// Generate service level SAS for a blob
const blobSAS = storage.generateBlobSASQueryParameters({
containerName, // Required
mediaLoc, // Required
permissions: storage.BlobSASPermissions.parse("racwd"), // Required
startsOn: startDate, // Required. Date type
expiresOn: endDate // Required. Date type
},
cerds // StorageSharedKeyCredential - `new StorageSharedKeyCredential(account, accountKey)`
).toString();

sasUrl = `https://${accountname}.blob.core.windows.net/${containerName}/${mediaLoc}?${blobSAS.toString()}`;
return sasUrl
}
catch (error) {
console.log(error);
}
}

注意:我使用 if 语句来设置容器,以便在测试时使我的生活更轻松。您肯定会在生产中使用环境变量。

非常感谢大家的支持。这是一个了不起的社区。

关于Blob 存储帐户的 Azure SAS token 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69366314/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com