node.js - 即使经过身份验证,也无法通过 url 访问 Azure 存储 Blob
问题描述
我有一个使用 express 框架的 nodejs 应用程序。用户必须根据其 MS Azure Active Directory 凭据通过 Oauth2 协议登录。这是使用passport-azure-ad-oauth2 npm 包完成的
我已成功使应用程序正常工作,以便可以将 blob 形式的文件上传到 azure 存储容器。容器访问级别设置为私有。我已经为容器分配了用户角色,以便 AD 中的某些用户具有“读者和数据访问权限”。所以我的理解是,当这些用户通过 Oauth2 进行身份验证时,他们应该能够在检索文件的 URL 时访问这些文件。但是,经过身份验证后,我无法访问这些文件。我收到以下错误。
ResourceNotFound
指定的资源不存在。RequestId:6341ef80-f01e-0011-6442-08f7c2000000 时间:2021-02-21T11:14:26.3475641Z
我还按照步骤在此处授予应用程序对 azure 存储的权限
我需要做什么才能使经过身份验证的用户可以转到每个 blob 的特定 url 并获得访问权限?我需要在请求中传递令牌吗?如果是这样,你如何做到这一点?
任何帮助将非常感激。
解决方案
404 错误(指定的资源不存在)始终与您的请求 URL 有关,但与访问令牌无关。
例如要获取 blob,您需要使用GET方法,并且需要一些 Request Headers。
GET https://myaccount.blob.core.windows.net/mycontainer/myblob
headers:
Authorization: Bear <access-token>
x-ms-version: 2020-04-08
x-ms-date: Fri, 26 Jun 2015 23:39:12 GMT
在没有用户的情况下通过应用程序权限获取访问令牌:
POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token
client_id={client_id}
&client_secret={client_secret}
&scope=http://storage.azure.com/.default // change to http://storage.azure.com/ for resource
&grant_type=client_credentials
通过已登录用户的委派权限获取访问令牌:
GET https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id={client_id}
&response_type=token
&redirect_uri=https://localhost:44300/
&scope=https://storage.azure.com/user_impersonation
&response_mode=fragment
&state=12345
&nonce=678910
注意:导航到您的存储帐户 -> 访问控制 (IAM) -> 添加角色分配 -> 选择Storage Blob Data XXX
角色和您的登录帐户。我在我身边添加了存储 Blob 数据贡献者,传播 RBAC 规则可能需要 5 分钟。
推荐阅读
- javascript - 将 datauristring 添加到文件上传
- openlayers - 在 SLD 中获取图层名称
- javascript - 如何将二维数组变成一个长数组
- flutter - 为什么我的颤振http响应json解码不返回外语字符
- apache-kafka-streams - 完整的 Kafka 流缓存作为内部操作会导致什么?
- c# - 401未经授权的Azure管理api
- javascript - 类型错误:在 BeforeEach 中设置 this.variable 时,无法设置未定义的属性“变量”
- flutter - 如何在整个颤振应用程序中格式化大数字?
- perl - Perl 脚本在不使用 Capture::Tiny 模块的情况下捕获标准错误消息
- node.js - 尝试将 nodejs 和 npm(或 yarn)添加到 yocto 图像(poky:zeus)