当前位置: 首页 > 知识库问答 >
问题:

AWS S3是否使用预先指定的URL验证用户访问?

丰辰沛
2023-03-14

我想在一个私人的AWS S3桶托管文件,只能由我的web应用程序认证的用户访问。这些文件下载的链接必须是静态的。

简单代理方法:

我知道这可以使用代理服务来完成。在这种情况下,静态链接将指向服务,服务将处理请求用户会话的验证,如果它是有效的,服务将使用来自S3的文件内容进行响应。

预签名URL代理方法:

然而,与其实现一个代理来控制对文件的访问,我想知道是否可以使用预先设计的URL来代替?

https://docs . AWS . Amazon . com/Amazon S3/latest/dev/shareobjectpresignedurl . html

在这种情况下,代理的作用只是向用户返回一个预先指定的URL,而不是从S3返回文件的实际有效负载。最终用户可以使用这个预先指定的URL直接从S3下载文件。我不清楚的是如何在浏览器中管理这个流程,我假设我需要编写JavaScript代码如下:

  1. 从代理服务请求预签名 URL
  2. 等待响应
  3. 使用响应中提供的预签名 URL(预签名 URL)下载实际文件

我走在正确的轨道上吗?

共有2个答案

何睿范
2023-03-14

这是一种有效的方法。

小心过期的凭据。签名URL在用于签名的访问凭据过期或它们的过期时间(您可以控制,在限制范围内)发生之前的较短时间内都是好的。如果您已经在使用临时凭据(这非常好!),您可能希望显式使用AssumeRole来控制过期时间(您可以从角色中担任角色以获得具有新时间限制的新临时凭据)。

还有另一个选择:Amazon Cognoto。这可以弥合用户帐户之间的差距,然后直接向用户的浏览器环境颁发每个用户的短期凭据。然后,他们可以使用自己的凭证对S3进行API调用。这有一些好处(你可以更好地在他们的配置文件中表达用户权限,而不是在他们生成URL之前自己检查用户权限)和一些复杂性(我可以用我的用户信用证来管理你的帐户,或者你可以控制我可以调用什么API?当IAM是你唯一的身份验证层时,最小特权真的很重要)。另一方面,IAM调用是免费的,你不需要为服务器付费,因此,如果您使用的是联合身份用户池,那么这种alo听起来很划算,而不是那么多。

危烨煜
2023-03-14

只需从您的服务器返回307重定向到预先签名的URL。例如。客户端请求:

GET /the/file HTTP/1.1

服务器生成一个预先指定的URL,并以如下方式响应:

HTTP/1.1 307 Temporary Redirect
Location: https://s3.aws..../the/file?...
 类似资料:
  • 我希望使用预先设计的URL功能,允许我的无服务器应用程序的用户上传图像。看完之后,这听起来是一个完美的解决方案,但是我有一个关于安全性的问题。 通过使用预先设计的URL方法,上传发生在客户端而不是服务器端,对此我唯一的担忧是,尽管我的应用程序要求在上传发生前进行身份验证,但这并不能防止用户上传恶意文件,因为他们可以绕过客户端检查来确定文件是否是图像。 有人对这件事有任何澄清吗? 谢谢

  • 但是,没有关于如何完成这一点的例子。此外,如果没有设置凭据,即使在向S3请求上载之前,SDK也会出错 JS SDK文档中提到了这一点,因此似乎有可能:

  • 我正在努力将Spring Security SAML集成到我们现有的安全基础设施中,以处理合作伙伴SSO。我正在查看Spring Security SAML作为模板附带的示例应用程序。 我看到在SAML中,SP必须指定AssertionConsumerServiceBinding,以提供IdP将向其发送AuthenticationResponse的返回url。 对于Spring Security

  • 我想为经过身份验证的用户提供一个预签名的 s3 url 以下载文件。我的后端有一个基于 JWT 的身份验证,并且可以基于令牌在我的后端生成 URL。因此,如果用户在设备上进行身份验证,他们可以单击一个按钮,它会打开一个指向预签名URL的新选项卡。我的问题是,如何防止用户将URL复制到未经身份验证的设备并从那里访问文件?我指的是使用预签名 URL 进行 AWS S3 身份验证的用户访问?这,但它不能

  • 我想创建一个登录,用户只需输入他/她的邮件地址,并通过电子邮件进行验证。使用firebase,到目前为止我有这样的代码: > 当用户在将邮件放入字段中后单击按钮登录时。我尝试创建一个新帐户(密码是随机的,因为我不需要它)。如果它不存在,我会发送验证邮件。如果该帐户存在,我会与checkIfVerifiedUser核实用户是否通过单击邮件来验证该帐户。 这是我调用的方法: 问题是我要么firebas

  • 我正在创建一个生产应用程序。 现在我已经创建了我的的一部分 此在登录时会生成一个对象,但我不热衷于通过HTTP标头发送未加密/未加密。 为了让您了解我的: 登录时: 正如您现在看到的(因为我还不确定如何处理它),我只查找用户名,然后检查用户名是否存在。 我的问题很简单,如何加密密码,然后在密码到达API后进行验证?