托管Amazon S3上的文件并检查请求URL中的用户名和密码是有效的

时间:2015-12-01 10:01:26

标签: amazon-web-services amazon-s3

我想知道在Amazon S3上是否可以使用以下内容,并对如何实现它有任何指导。

我们有一个系统可以在特定的文件结构中生成许多1000个静态XML文件,例如:

public function findFriends($userId)
{
    return $this->getEntityManager()
        ->createQuery('SELECT f FROM Friends WHERE userId = :userId OR FriendId = :userId')
        ->setParameter('userId', $userId)
        ->getOneOrNullResult();
}

我们希望最终用户能够使用类似以下的URL直接从S3访问这些文件:

public function findFriends($userId)
{
    return $this->getEntityManager()
        ->createQueryBuilder()
        ->from('Friends', 'f')
        ->where('f.userId = :userId')
        ->orWhere('f.friendId = :userId')
        ->setParameter('userId', $userId)
        ->getQuery()
        ->getOneOrNullResult();
}

只有在URL中传递的用户名和密码有效时,才应返回该文件。 (例如,根据存储在S3或其他位置的另一个文件中的列表进行验证。)

在我看来这是一个简单的场景。有可能吗?

感谢您的时间!

2 个答案:

答案 0 :(得分:0)

您首先应该咨询有关该主题的AWS documentation。只要涉及AWS IAM帐户,您就可以非常精细地控制对对象的访问。

您要求的内容听起来像presigned URLs的用例。您可以生成包含时间限制令牌的URL,以允许访问该对象。目前,您需要使用其中一个SDK或使用Visual Studio以编程方式生成此URL;在撰写本文时,只记录了Java和.NET,但我知道事实上Python SDK也包含此功能,因此也可能包含其他功能。

请注意,与用户名和密码不同,无法撤消预先签名的令牌。这将被令牌过期所取代,因此您应该选择一个简短的有效期窗口。最实际的实现可能是让服务器以您需要的任何自定义方式进行身份验证,然后生成具有非常短的有效性(几分钟就足够)的预签名URL,并将经过身份验证的用户重定向到该URL。这使您可以完全控制身份验证,同时获得在S3上托管文件的好处。

答案 1 :(得分:0)

根据您的要求和实施方式,可以有多种解决方案。

  • 预签名的URL似乎是一个很好的解决方案,但不允许您传递用户名和密码。有关使用aws-cli的预签名URL,请参考以下链接: https://docs.aws.amazon.com/cli/latest/reference/s3/presign.html
  • 另一种方法:将API网关与lambda集成,您可以在其中传递用户名和密码作为正文(POST),并且lambda可以返回预签名的URL或S3对象本身的内容。您还可以使用其他策略对请求进行身份验证。

注意:将用户名和密码作为URL参数传递是一个非常糟糕的主意。

快乐的编码:)