AWS S3 使用预签名 URL 验证用户访问?
AWS S3 authenticated user access using presigned URLs?
我想在私有 AWS S3 存储桶上托管文件,只有通过我的 Web 应用程序身份验证的用户才能访问该存储桶。这些文件下载的链接必须是静态的。
简单代理方法:
我知道这可以使用代理服务来完成。在这种情况下,静态链接将指向该服务,并且该服务将处理验证请求用户会话,如果有效,该服务将使用来自 S3 的文件内容进行响应。
预签名 URL 代理方法:
然而,我想知道我是否可以使用预签名的 URLs 来代替对文件的访问,而不是实施代理来访问文件?
https://docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURL.html
在这种情况下,代理的作用只是 return 向用户预先签名 URL 而不是来自 S3 的文件的实际负载。然后最终用户可以使用这个预签名 URL 直接从 S3 下载文件。我不清楚的是如何在浏览器中管理此流程,我假设我需要将 JavaScript 写入以下内容:
- 从代理服务
请求预签名URL
- 等待回复
- 使用响应中提供的预签名URL(预签名URL)下载实际文件
我走的路对吗?
只需 return 从您的服务器到预签名 URL 的 307 重定向。例如。客户要求:
GET /the/file HTTP/1.1
并且服务器生成预签名的 URL 并响应:
HTTP/1.1 307 Temporary Redirect
Location: https://s3.aws..../the/file?...
这是一个有效的方法。
当心凭据过期。签名的 URL 在用于签名它们的访问凭据过期或它们的过期时间(您可以控制,在限制范围内)发生之前的较短时间内是好的。如果您已经在使用临时凭证(这非常好!),您可能希望明确使用 AssumeRole 来控制到期时间(您可以从角色中担任角色以获取具有新时间限制的新临时凭证) .
还有另一种选择:Amazon Cognito。这可以弥合您的用户帐户之间的差距,然后直接向用户的浏览器环境颁发每个用户的短期凭证。然后,他们可以使用自己的凭据对 S3 进行 API 调用。这有一些好处(你可以更好地在他们的个人资料中表达用户权限,而不是在他们生成 URL 之前自己检查他们)和一些复杂性(我可以用我的用户信用来拒绝你的帐户,或者你控制什么 APIs我可以打电话吗?当 IAM 是你唯一的身份验证层时,最低权限真的很重要)另一方面,IAM 调用是免费的,你不需要为托管它们的服务器付费,所以如果你使用联合身份,这听起来很划算 -用户池,没那么多。
我想在私有 AWS S3 存储桶上托管文件,只有通过我的 Web 应用程序身份验证的用户才能访问该存储桶。这些文件下载的链接必须是静态的。
简单代理方法:
我知道这可以使用代理服务来完成。在这种情况下,静态链接将指向该服务,并且该服务将处理验证请求用户会话,如果有效,该服务将使用来自 S3 的文件内容进行响应。
预签名 URL 代理方法:
然而,我想知道我是否可以使用预签名的 URLs 来代替对文件的访问,而不是实施代理来访问文件?
https://docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURL.html
在这种情况下,代理的作用只是 return 向用户预先签名 URL 而不是来自 S3 的文件的实际负载。然后最终用户可以使用这个预签名 URL 直接从 S3 下载文件。我不清楚的是如何在浏览器中管理此流程,我假设我需要将 JavaScript 写入以下内容:
- 从代理服务 请求预签名URL
- 等待回复
- 使用响应中提供的预签名URL(预签名URL)下载实际文件
我走的路对吗?
只需 return 从您的服务器到预签名 URL 的 307 重定向。例如。客户要求:
GET /the/file HTTP/1.1
并且服务器生成预签名的 URL 并响应:
HTTP/1.1 307 Temporary Redirect
Location: https://s3.aws..../the/file?...
这是一个有效的方法。
当心凭据过期。签名的 URL 在用于签名它们的访问凭据过期或它们的过期时间(您可以控制,在限制范围内)发生之前的较短时间内是好的。如果您已经在使用临时凭证(这非常好!),您可能希望明确使用 AssumeRole 来控制到期时间(您可以从角色中担任角色以获取具有新时间限制的新临时凭证) .
还有另一种选择:Amazon Cognito。这可以弥合您的用户帐户之间的差距,然后直接向用户的浏览器环境颁发每个用户的短期凭证。然后,他们可以使用自己的凭据对 S3 进行 API 调用。这有一些好处(你可以更好地在他们的个人资料中表达用户权限,而不是在他们生成 URL 之前自己检查他们)和一些复杂性(我可以用我的用户信用来拒绝你的帐户,或者你控制什么 APIs我可以打电话吗?当 IAM 是你唯一的身份验证层时,最低权限真的很重要)另一方面,IAM 调用是免费的,你不需要为托管它们的服务器付费,所以如果你使用联合身份,这听起来很划算 -用户池,没那么多。