#node.js #reactjs #azure #axios #azure-blob-storage
#node.js #reactjs #azure #axios #azure-blob-хранилище
Вопрос:
Я пытаюсь подключиться к API хранилища больших двоичных объектов Azure с помощью Node.js . Я специально не хочу использовать SDK для хранения больших двоичных объектов, я хочу использовать axios для доступа к REST API. Я просто пытаюсь выполнить простой вызов контейнеров списка, как указано здесь: https://docs.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 и сообщением об ошибке:
Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
Я выполняю аутентификацию в соответствии с https://docs.microsoft.com/en-us/rest/api/storageservices/authorize-with-azure-active-directory , и я получаю свой токен доступа на вкладке Ключи доступа к учетной записи хранилища Azure. Почему у меня сбой аутентификации?
Комментарии:
1. Не могли бы вы предоставить подробную информацию о том, как вы получаете токен доступа?
2. На вкладке «Ключи доступа» учетной записи хранилища Azure в разделе «Ключ»
3. Привет. Это ключ доступа, а не токен доступа к AD. Если вы хотите получить доступ к хранилищу через AD auth, пожалуйста, обратитесь к моему решению.
Ответ №1:
Если вы хотите получить доступ к Azure blob REST API с помощью Azure AD auth, пожалуйста, обратитесь к следующим шагам
- Назначить
Storage Blob Data Contributor
пользователю AD или участнику службы. Для получения более подробной информации, пожалуйста, обратитесь к здесь и здесь
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. Но, пожалуйста, обратите внимание, что если вы вызовете rest API в приложении react, вы получите ошибку cors, и мы не сможем включить cors в Azure AD. Поэтому я предлагаю вам вызвать rest API во внутреннем приложении
POST /{tenant}/oauth2/v2.0/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded
client_id=
amp;scope=http//storage.azure.com/.default
amp;client_secret=
amp;grant_type=client_credentials
Если вы используете Azure AD user, вы можете интегрировать Azure AD auth в свое приложение react с помощью package react-aad-msal
. Что касается его настройки, пожалуйста, обратитесь к образцу
- Вызов 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, пожалуйста, обратитесь к следующему коду
- установите 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)}amp;ss=${(signedservice)}amp;srt=${(signedresourcetype)}amp;sp=${(signedpermissions)}amp;se=${encodeURIComponent(signedexpiry)}amp;spr=${(signedProtocol)}amp;sig=${encodeURIComponent(sig)}`;
const blobUrl= `<you blob URL>?{sasToken }`
Комментарии:
1. С помощью Javascript SDK мне нужно только предоставить строку подключения, связанную с моей учетной записью хранилища, для аутентификации. Должен быть более простой способ аутентификации с помощью REST API.
2. @rbuzby На данный момент мы просто можем использовать подпись общего доступа с общим ключом или токен Azure Active Directory для доступа к Azure Blob rest API и не можем использовать ключ доступа для этого напрямую: docs.microsoft.com/en-us/rest/api/storageservices /. … Кроме того, в соответствии с вашими потребностями, я думаю, вы можете использовать подпись общего доступа для ее реализации: docs.microsoft.com/en-us/azure/storage/blobs /…
3. @rbuzby О том, как создать sas, пожалуйста, обратитесь к docs.microsoft.com/en-us/rest/api/storageservices /. …