我正在尝试使用 Node.js 连接到 Azure Blob 存储 API。我特别不想使用 Blob 存储 SDK,我想使用 axios 来访问 REST API。我只是想执行一个简单的列表容器调用,如下所示:https://learn.microsoft.com/en-us/rest/api/storageservices/list-containers2 。但是,我遇到了授权问题。
这是我简单的 axios 调用:
try {
const azureRes = await axios({
method: 'GET',
url:
'https://<accountname>.blob.core.windows.net/?comp=list',
headers: {
'x-ms-version': '2017-11-09',
Authorization:
'Bearer <access_token>'
}
});
console.log('azureRes', azureRes);
} catch (err) {
console.log('err:', err);
}
但是我收到了包含 403 状态代码和错误消息的响应:
服务器无法验证请求。确保授权 header 的值格式正确,包括签名。
我正在根据 https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-azure-active-directory 进行身份验证,并且我正在从 Azure 存储帐户“访问 key ”选项卡获取访问 token 。为什么我的身份验证失败?
最佳答案
如果您想通过 Azure AD 身份验证访问 Azure Blob REST API,请参阅以下步骤
az role assignment create \
--role "Storage Blob Data Contributor" \
--assignee " supported format: object id, user sign-in name, or service principal name." \
--scope "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>"
- 获取 Azure AD token
如果您使用服务主体,我们可以使用以下 API 获取访问 token 。但请注意,如果您在 React 应用程序中调用其余 API,您将收到 cors 错误,并且我们无法在 Azure AD 上启用 cors。所以我建议你在后端应用程序中调用其余API
POST /{tenant}/oauth2/v2.0/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded
client_id=
&scope=http//storage.azure.com/.default
&client_secret=
&grant_type=client_credentials
如果您使用 Azure AD 用户,则可以使用包 react-aad-msal
将 Azure AD 身份验证集成到您的 React 应用程序中。关于如何配置,请引用sample
- 调用 API
try {
const azureRes = await axios({
method: 'GET',
url:
'https://<accountname>.blob.core.windows.net/?comp=list',
headers: {
'x-ms-version': '2017-11-09',
Authorization:
'Bearer <access_token>'
}
});
console.log('azureRes', azureRes);
} catch (err) {
console.log('err:', err);
}
<小时/>
更新 关于如何创建sas token,请引用以下代码
- 安装 pcakge
crypto-js
npm install crypto-js
- 代码
import * as CryptoJS from 'crypto-js';
const accountName =<>;
const key=<>;
const start = new Date(new Date().getTime() - (15 * 60 * 1000));
const end = new Date(new Date().getTime() + (30 * 60 * 1000));
const signedpermissions = 'rwdlac';
const signedservice = 'b';
const signedresourcetype = 'sco';
const signedexpiry = end.toISOString().substring(0, end.toISOString().lastIndexOf('.')) + 'Z';
const signedProtocol = 'https';
const signedversion = '2018-03-28';
const StringToSign =
accountName+ '\n' +
signedpermissions + '\n' +
signedservice + '\n' +
signedresourcetype + '\n' +
'\n' +
signedexpiry + '\n' +
'\n' +
signedProtocol + '\n' +
signedversion + '\n';
var str =CryptoJS.HmacSHA256(StringToSign,CryptoJS.enc.Base64.parse(key));
var sig = CryptoJS.enc.Base64.stringify(str);
const sasToken =`sv=${(signedversion)}&ss=${(signedservice)}&srt=${(signedresourcetype)}&sp=${(signedpermissions)}&se=${encodeURIComponent(signedexpiry)}&spr=${(signedProtocol)}&sig=${encodeURIComponent(sig)}`;
const blobUrl= `<you blob URL>?{sasToken }`
关于node.js - 使用 axios、Node.js 连接到 Azure Blob 存储 REST API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64996354/