- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
亚马逊推出了Cloudfront signed cookie最近除了签名的网址。
一个类似的问题是关于 signed url .显然支持 signed url in the cloudfront SDK
但是我在 aws python SDK 中找不到此功能的支持。
我怎样才能创建一个签名的 cookie?
最佳答案
我创建了一个 boto 功能请求来添加它,但与此同时我让它与我的 django python 应用程序一起工作。这是我自己生成的简单代码。底部是一个示例 django View 方法,因此您可以看到我如何为包含 Cloudfront 内容的网页设置 cookie。
import time
from boto.cloudfront import CloudFrontConnection
from boto.cloudfront.distribution import Distribution
from config import settings
import logging
from django.template.context import RequestContext
from django.shortcuts import render_to_response
logger = logging.getLogger('boto')
logger.setLevel(logging.CRITICAL) #disable DEBUG logging that's enabled in AWS by default (outside of django)
AWS_ACCESS_KEY="AKABCDE1235ABCDEF22A"#SAMPLE
AWS_SECRET_KEY="a1wd2sD1A/GS8qggkXK1u8kHlh+BiLp0C3nBJ2wW" #SAMPLE
key_pair_id="APKABCDEF123ABCDEFAG" #SAMPLE
DOWNLOAD_DIST_ID = "E1ABCDEF3ABCDE" #SAMPLE replace with the ID of your Cloudfront dist from Cloudfront console
############################################
def generate_signed_cookies(resource,expire_minutes=5):
"""
@resource path to s3 object inside bucket(or a wildcard path,e.g. '/blah/*' or '*')
@expire_minutes how many minutes before we expire these access credentials (within cookie)
return tuple of domain used in resource URL & dict of name=>value cookies
"""
if not resource:
resource = 'images/*'
dist_id = DOWNLOAD_DIST_ID
conn = CloudFrontConnection(AWS_ACCESS_KEY, AWS_SECRET_KEY)
dist = SignedCookiedCloudfrontDistribution(conn,dist_id)
return dist.create_signed_cookies(resource,expire_minutes=expire_minutes)
############################################
class SignedCookiedCloudfrontDistribution():
def __init__(self,connection,download_dist_id,cname=True):
"""
@download_dist_id id of your Cloudfront download distribution
@cname boolean True to use first domain cname, False to use
cloudfront domain name, defaults to cname
which presumably matches your writeable cookies ( .mydomain.com)
"""
self.download_dist = None
self.domain = None
try:
download_dist = connection.get_distribution_info(download_dist_id)
if cname and download_dist.config.cnames:
self.domain = download_dist.config.cnames[0] #use first cname if defined
else:
self.domain = download_dist.domain_name
self.download_dist = download_dist
except Exception, ex:
logging.error(ex)
def get_http_resource_url(self,resource=None,secure=False):
"""
@resource optional path and/or filename to the resource
(e.g. /mydir/somefile.txt);
defaults to wildcard if unset '*'
@secure whether to use https or http protocol for Cloudfront URL - update
to match your distribution settings
return constructed URL
"""
if not resource:
resource = '*'
protocol = "http" if not secure else "https"
http_resource = '%s://%s/%s' % (protocol,self.domain,resource)
return http_resource
def create_signed_cookies(self,resource,expire_minutes=3):
"""
generate the Cloudfront download distirbution signed cookies
@resource path to the file, path, or wildcard pattern to generate policy for
@expire_minutes number of minutes until expiration
return tuple with domain used within policy (so it matches
cookie domain), and dict of cloudfront cookies you
should set in request header
"""
http_resource = self.get_http_resource_url(resource,secure=False) #per-file access #NOTE secure should match security settings of cloudfront distribution
# http_resource = self.get_http_resource_url("somedir/*") #blanket access to all /somedir files inside my bucket
# http_resource = self.get_http_resource_url("*") #blanket access to all files inside my bucket
#generate no-whitespace json policy, then base64 encode & make url safe
policy = Distribution._canned_policy(http_resource,SignedCookiedCloudfrontDistribution.get_expires(expire_minutes))
encoded_policy = Distribution._url_base64_encode(policy)
#assemble the 3 Cloudfront cookies
signature = SignedCookiedCloudfrontDistribution.generate_signature(policy,private_key_file=settings.AMAZON_PRIV_KEY_FILE)
cookies = {
"CloudFront-Policy" :encoded_policy,
"CloudFront-Signature" :signature,
"CloudFront-Key-Pair-Id" :key_pair_id #e.g, APKA..... -> same value you use when you sign URLs with boto distribution.create_signed_url() function
}
return self.domain,cookies
@staticmethod
def get_expires(minutes):
unixTime = time.time() + (minutes * 60)
expires = int(unixTime) #if not converted to int causes Malformed Policy error and has 2 decimals in value
return expires
@staticmethod
def generate_signature(policy,private_key_file=None):
"""
@policy no-whitespace json str (NOT encoded yet)
@private_key_file your .pem file with which to sign the policy
return encoded signature for use in cookie
"""
#sign the policy - code borrowed from Distribution._create_signing_params()
signature = Distribution._sign_string(policy, private_key_file)
#now base64 encode the signature & make URL safe
encoded_signature = Distribution._url_base64_encode(signature)
return encoded_signature
############################################
def sample_django_view_method(request,template="mytemplate.html"):
expireLen = 30 #30 minutes
s3resource = "somepath_in_my_bucket/afile.mp4"
context = {} #variables I'm passing to my html template
response = render_to_response(template, context, context_instance=RequestContext(request))
domain,cookies = generate_signed_cookies(s3resource,expire_minutes=expireLen)
#TROUBLESHOOTING COOKIES:
#NOTE - Cookie Domain must be a domain you control that spans your app & your Cloudfront CNAME
#NOTE - (e.g. if my webapp is www.mydomain.com and my AWS Download Distribution has cname cloud.mydomain.com, cant set cookies from webapp to
# www.mydomain.com or localhost.mydomain.com or cloud.mydomain.com and have them work
# -> instead set cookies to .mydomain.com to work across sub-domains, you can then verify in request headers to CloudFront that these cookies get passed.
# TIP - if you set_cookies from a page with a .mydomain.com suffix, but don't see them get set in Chrome they didn't get set because of permissions - can't set to a diff subdomain or diff base domain
# TIP - if you set_cookies and see them in Chrome but don't see them in request headers to Cloudfront, cookie domain is likely too narrow, need to widen to span subdomains
base_domain = '.mydomain.com'
# NOTE: Sanity check when testing so you can flag any gotchas - I have not fully tested using non-cname urls inside policy vs all possible domains for cookie itself
if not domain.endswith(base_domain):
logger.warn("This likely won't work - your resource permissions use a different domain than your cookies")
for name,value in cookies.items():
response.set_cookie(name,value=value,httponly=True,domain=base_domain)
return response
############################################
if __name__ == '__main__':
domain,cookies = generate_signed_cookies('images/*',expire_minutes=30)
关于我的设置的注意事项:
我使用了 Chrome 网络开发者工具:
我的 AWS 配置
有了上面的 cookie 生成代码后,最棘手的部分是:
关于python - 为 Amazon CloudFront 创建签名 Cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29383373/
我已经为我们的 Cloudfront 分配设置了一个备用域名,这样我们就可以从 oursite.com 提供服务。我们想禁用 ourdistid.cloudfront.net,这样我们的站点只能从一个
假设一个域名为 www.example.com 的网站托管在网站托管商(而非亚马逊)的 LAMP 服务器上。该域由 Route53 管理。 是否有可能以某种方式保留 LAMP 网络服务器上的所有设置并
我在使Cloudfront具有多个来源的工作时遇到麻烦。 我有两个起源: 起源1 小路: 默认 (*) 起源: Custom-example1.com/p 起源2 小路: ns/ 起源: Custom
TLDR:我们必须通过为来自 Lambda 函数的响应创建新的缓存行为来欺骗 CloudFront 307 重定向缓存。 你不会相信我们离实现这一目标有多近。我们在最后一步卡得太厉害了。 商业案例:
How do you set a default root object for subdirectories for a statically hosted website on Cloudfron
有人知道如何使使用友好 url 的自定义来源的根文档无效吗? 例如:example.com ? 通过 AWS Create Invalidation 对话框请求的正确对象路径是什么? 文档仅引用实际文
我正在使用带有自定义源的 CloudFront,并希望将来自 Web 应用程序的某些请求重定向到 CloudFront(客户端使用直接 URL,不能更改为基于 CloudFront 的 URL)。为了
我正在尝试在 AWS CloudFront 上上传公钥。我按如下方式生成 key ssh-keygen -t ecdsa -b 521 我也试过 ssh-keygen -b 4096 当我通过控制台上
我在 wordpress 重定向中的重定向导致域更改时遇到了一些问题。 例子:网站 - noncdn.somedomain.comCDN 网址 - www.domain.com 当我打开没有尾部斜杠的
在 CloudFront 行为设置中,“全部”是将所有请求 header 转发到源吗? Values That You Specify When You Create or Update a Dist
我们的应用程序中使用的图像是从 Amazon CloudFront 呈现的。 修改现有图像时,它不会立即反射(reflect)图像更改,因为 CloudFront 需要大约 24 小时才能更新。 作为
我想设置亚马逊云端,但是 Assets 需要在 http 和 https 上都可用。 我也想使用多个 cname。例如xyz0.cloudfront.netxyz1.cloudfront.netxyz
路径模式属性的文档并不完全详尽。 The pattern to which this cache behavior applies. For example, you can specify imag
我浏览了文档并进行了大量搜索。这些是我知道我可以使用 CloudFront 创建的签名 url 做的事情: 使用固定策略设置时间限制 监控该项目被查看的次数 我还可以为我的签名 URL 设置命中限制吗
cloudfront 是否支持 TLSv1.3 我没有看到任何文档说它在 cloudfront 和自定义来源之间支持?我强烈要求使用 TLSv1.3 最佳答案 CloudFront 现在支持 TLS
我最近才在阅读 Varnish Cache 的功能,以帮助优化我的 PHP 网站的性能。我读到了一个名为 Edge Side Includes 的功能,它似乎让我可以选择构建可以缓存在组件级别的 ht
我是部署静态站点的新手。搜索了大约一段时间的解决方案,根据我遇到的问题,我没有找到任何有用的信息。 宗旨 :我想在 CloudFront 上运行我生成的 Nuxt.js 静态站点。 问题 : 跑命令n
我正在使用 Amazon CloudFront 传送一些 HDS 文件。我有一个原始服务器,它检查 HTTP HEADER REFERER,如果不允许,它会阻止它。 问题是云前端正在删除引用 head
我正在使用 lambda@edge 通过 cloudfront 重定向我的网站。 我已将版本化 lambda arn 附加到我的云前端缓存行为及其所有 4 个事件。 当我访问我的云端端点时,它会显示
有没有办法让 Amazon CloudFront 失效(通过管理控制台),使所有匹配模式的文件失效?例如图像/*.png 语境 - 我在我的网站上为图像设置了缓存控制,但错误地在 Apache 的缓存
我是一名优秀的程序员,十分优秀!