限制我的移动应用程序访问云端签名 URL(GET 请求)

Posted

技术标签:

【中文标题】限制我的移动应用程序访问云端签名 URL(GET 请求)【英文标题】:Restrict cloudfront signed url (GET Request) to be accessed by my mobile application 【发布时间】:2016-06-13 19:22:26 【问题描述】:

我正在尝试使用 Amazon Cloudfront 向使用签名 URL 的应用用户提供视频文件。我已经使用documentation 创建了签名的网址,并且效果很好。生成的url有签名、过期时间和keypair_id。

问题

我想要实现的是仅当请求来自我的特定移动应用程序时才向用户提供视频文件。我正在寻找一种解决方案来在云端授权请求(在签名的 url 上)。

因此,如果用户尝试使用我们的移动应用访问签名的 url,我们希望提供内容,但如果从 Web 或任何其他移动客户端访问该 url,我们希望引发授权错误或 404。

我浏览了文档和几个博客,希望实现上述目标,每个人都向我指出了使用我已经使用的签名 URL 的方向。但是这些网址仍然可以通过浏览器直接访问。

我也想知道,为什么签名的 url 有签名作为 GET 参数,好像签名被删除了,仍然可以使用没有 get 查询参数的 url 访问内容。

Signed Url: http://d2z7g8y6l5f1j0.cloudfront.net/test_upload.mp4?Expires=1456828601&Signature=R3tljkRxGM9se2S4IJT908sT2BBGNJkpWE9IE-v1GAt-QY0WcaEVEY-OYvSSlhFK1ueNcWhgAscJQ7J~qUKZUt3XS5raKU3kj9STKYYzCemRRm1j5DE8XfhjRKRggSSw138F0lr~tDt~TLoJ7Pj9NNvoGl42jNNLaET7~d9pkAGAh-sNpoS1gz~d0CZTo41ZTFMIzshgZNxrWpCOR0PrLHfRALy2H9-Z9w4XfU4v66WEseVQ3FWyeXFyV0UO2S-KIXbe1ODiHFC6Ae6AJlWzoFfIGAxiLymmtUMJgeQHnu80u97ysMbbNYvek-S0tQBkkID3zC~tDQH~EjXPYcNUbA__&Key-Pair-Id=APKAINPV56WSGDECRTPQ

^^^ Serves the content

Original Url: http://d2z7g8y6l5f1j0.cloudfront.net/test_upload.mp4

^^^ Still serves the content

以上网址有什么不同?

再刊

我生成的签名 url 仍在提供内容,那么 expires GET 查询参数的意义何在,或者问题是我是否正确地制作了 url。

我按照以下方法生成我的签名网址:

from boto.cloudfront import CloudFrontConnection
from boto.cloudfront.distribution import Distribution

# establish cloudfront connection
cloudfront_connection = CloudFrontConnection('AWS_KEY', 'AWS_SECRET')
expiry_time = int(time.time() + 3000)

#get the distribution
distribution = Distribution(connection = cloudfront_connection, domain_name = '<specified_domain_name>', 'id' = '<specified distribution id>')

#create signed url
signed_url = distribution.create_signed_url(url = '<cloudfront_url>', keypair_id = '<cloudfront keypair_id>', expire_time = expiry_time, private_key_file = open('<location>', 'r'))

【问题讨论】:

我认为,在 AWS 的工程师监控它们的情况下,在 aws 论坛上联系可能是一个好主意。具体来说,熟悉与云前端相关的此类问题的工程师。那里的社区(不仅仅是 aws 工程师)可能已经尝试过,并且可能知道您的询问的答案。 非常感谢@86bornprgmr 的输入,我也会在那里提出查询。 【参考方案1】:

我浏览了文档和几个博客,希望实现上述目标,每个人都向我指出了使用我已经使用的签名 URL 的方向。但是这些网址仍然可以通过浏览器直接访问。

可能您对签名 URL 功能有误解。任何拥有该 URL 的客户端都可以访问该内容 - 没有什么将其限制为特定的移动浏览器或桌面浏览器或其他任何东西。只要 URL 有效(例如在有效期内/未过期,在您指定的 IP 范围内等),任何客户端都将被允许访问。

您的应用程序应在用户请求时实时生成签名 URL,并且该 URL 应在您可接受的时间范围内过期。这在How Signed URLs work 下的文档中进行了解释。

我也想知道,为什么签名的 url 有签名作为 GET 参数,好像签名被删除了,仍然可以使用没有 get 查询参数的 url 访问内容。

您可以设置缓存行为,限制对具有有效签名 URL 的请求者的访问。总而言之,当您设置分发时,您可以根据用户请求的路径配置各种缓存行为。

这个话题有点隐藏在文档中。请参阅 Cache Behavior Settings 上的文档,尤其是 Path Pattern 和 Restrict Viewer Access 小节。

【讨论】:

我明白,当收到 url 时,它一定会被请求并因此获取内容。我只是担心这部分,当我有 url 说 xyz.cloudfront.net/test_video.mp4 然后我们在 GET 参数中拥有整个东西,例如 xyz.cloudfront.net/test_video.mp4?Expires=abc&Signature=mno.. 我已经得到了可以再次访问的邮件 url。我面临的另一个问题是即使在给出到期时间之后,网址也不会过期。 您是否设置了路径模式缓存行为以禁止访问,除非使用签名的 url? 不,我还没有设置...通过文档进行正确设置,我使用了默认设置,一旦我有一些进展,我会尽快恢复...谢谢帮助.. 太棒了。如果您认为这准确且有帮助,请点赞和/或接受我的回答!

以上是关于限制我的移动应用程序访问云端签名 URL(GET 请求)的主要内容,如果未能解决你的问题,请参考以下文章

如何配置亚马逊云端以阻止某些 S3 存储桶文件访问?

AWS 静态网站 + 云端签名 cookie

限制对云端分发背后的 s3 静态网站的访问

“拒绝访问 | <url> 使用 Cloudflare 限制访问” GET 请求 Postman

Cloudfront URL 永不过期

Amazon s3 预签名 URL 受 IP 地址限制