Подключитесь к REST API хранилища больших двоичных объектов Azure с помощью axios, Node.js

#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, пожалуйста, обратитесь к следующим шагам

  1. Назначить 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>"
 
  1. Получить токен 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 . Что касается его настройки, пожалуйста, обратитесь к образцу

  1. Вызов 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, пожалуйста, обратитесь к следующему коду

  1. установите pcakge crypto-js
 npm install crypto-js

 
  1. код
 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 /.