如果你想通过 Azure AD auth 访问 Azure blob REST API,请参考以下步骤
- 将
Storage Blob Data Contributor 分配给AD 用户或服务主体。更多详情请参考here和here
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 令牌
如果您使用服务主体,我们可以通过以下 API 获取访问令牌。但请注意,如果您在 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 用户,您可以将 Azure AD 身份验证与包 react-aad-msal 集成到您的 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 }`