node.js - 使用 axios、Node.js 连接到 Azure Blob 存储 REST API

标签 node.js reactjs azure axios azure-blob-storage

我正在尝试使用 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,请参阅以下步骤

  1. 存储 Blob 数据贡献者分配给 AD 用户或服务主体。更多详情请引用herehere
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,请引用以下代码

    1. 安装 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/

    相关文章:

    javascript - React 中是否可以重新挂载组件?

    javascript - 如何在 React 中创建下拉菜单?

    c# - Microsoft.WindowsAzure.Storage.dll 中发生了类型 'Microsoft.WindowsAzure.Storage.StorageException' 的第一次机会异常

    javascript - 当我使用 ' ; ' 而不是 ' && ' 时,输出发生变化,我需要帮助来理解它

    javascript - 引用外部脚本和资源而不是下载它们 "locally"到您的服务器是否安全?

    javascript - ReactJS 和 material-ui

    Azure 机器学习-Azure Blob 存储

    azure - 如何检查Databricks集群是否存在Log4J漏洞?

    javascript - Mongoose 嵌入式文档更新

    javascript - Sails.js 中的多个关联