node.js - 如何向应用程序的用户授予对 S3 资源的有限访问权限?
问题描述
每个用户都有保存在 S3 中的唯一数据。此资源应仅对该特定用户可见。传统的方法是在后端获取这些东西并将其传递给用户。确保在应用程序逻辑中只有用户有资格获得它。但是,当我可以将密钥/令牌提供给我希望能够访问 S3 存储桶的用户时,为什么要通过我的应用程序传递这些额外的数据。因此他们可以从中检索数据并保存到其中。
解决方案
传统的方法是在后端获取这些东西并将其传递给用户。
不,不是。没有人应该这样做。
但是,当我可以将密钥/令牌提供给用户时,为什么要通过我的应用程序传递这些额外的数据......
你在这里是正确的方向。幸运的是,S3 定义了一个更好的方法,这也是通常的方法。
您无需提供密钥,而是对 URL 进行加密签名。密钥/秘密保留在服务器端,对最终用户隐藏。您创建一个 URL 来指示要下载的资源以及其他参数,例如该 URL 的到期日期。然后,您使用只有拥有密钥/秘密的人才能计算的计算值“签名”它。生成的 URL 可以通过 API 响应或您想要的任何方法直接提供给您的客户端。
然后,客户端使用此 URL 请求资源,并直接从 S3 提供。S3 验证签名,知道它来自您,并提供适当的响应。
一个示例,假设您使用的是 S3 JS SDK:
s3.getSignedUrl('getObject', {
Bucket: 'bucket',
Key: 'path/to/object'
});
另请参阅: https ://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl-property
推荐阅读
- vue.js - 将 Vuejs 应用程序打包为库
- python - 了解 lstm 和密集层之间的连接
- amazon-web-services - 无法使用 Windows PowerShell 通过运行 Windows Server 2016 Base 的 Jump Server SSH 到 AWS 的私有子网中的 RHEL 7 EC2 实例
- python - 在 discord.py 中添加角色
- linux - Apache 上的 SSL 更新问题
- sql - 可执行文件如何连接到 SQL Server
- java - 有没有办法在没有任何新配置的情况下设置 spring 属性源?
- java - 修复 Intellij Idea 下载源 Connection Refused to host 127.0.0.1 错误
- css - 如何使用 Tailwind 和 CSS 创建交替的垂直时间线
- flutter - Open_file 实际上并没有在 Andriod 模拟器中打开 pdf