[英]Access Denied (403) from AWS Cloudfront Signed Cookie on Rails backed app
我为此尝试了一整天,但我不能......
答:我创建了一个用于创建签名cookie的模型。 我得到了以下帮助: spacevatican.org
def cookie_data(resource, expiry)
raw_policy = policy(resource, expiry)
{
'CloudFront-Expires' => expiry.utc.to_i,
'CloudFront-Signature' => sign(raw_policy),
'CloudFront-Key-Pair-Id' => ENV['CLOUDFRONT_KEY_PAIR_ID']
}
end
private
def policy(url, expiry)
{
"Statement"=> [
{
"Resource" => url,
"Condition"=>{
"DateLessThan" =>{"AWS:EpochTime"=> expiry.utc.to_i}
}
}
]
}.to_json.gsub(/\s+/,'')
end
def safe_base64(data)
Base64.strict_encode64(data).tr('+=/', '-_~')
end
def sign(data)
digest = OpenSSL::Digest::SHA1.new
key = OpenSSL::PKey::RSA.new ENV['CLOUDFRONT_PRIVATE_KEY']
result = key.sign digest, data
safe_base64(result)
end
B.使用'resource'和'expiry'调用cookie_data。 我得到了兰达尔夫的帮助以获得适当的资源。
base_domain = '.myapp.com' # sample name
cookie_domain: '.myapp.com'
cookie_data("http://#{URI.parse(base_domain).host}/*", 1.hour.from_now).each do |name, value|
cookies[name] = { value: value, domain: cookie_domain }
end
C.从A&B,Cloudfront的三个验证通过 - 1.三个cookie现有验证,和2.到期现有验证,3。解码可用验证。 由于无效请求上的错误消息,我知道这三个验证。 但毕竟,我总是得到同样的信息 - 拒绝访问。
有一些嫌疑人。
我的Cloudfront CNAME是'img.myapp.com'
(示例),但我的测试域是'http://dev.myapp.com/#/home'
,这是我的本地开发服务器(我更改了localhost名称) 。
所以我尝试了很多(base_domain,cookie_domain)组合:(img.myapp.com,.myapp.com),(。myapp.com,.myapp.com),(dev.myapp.com,.myapp.com) 。
但是全部否认了。
我的Cloudfront和S3设置与randalv上的相同 。 但我介意两件事。 在Cloudfront的原始设置中,“限制存储桶访问”为“否”。 我不在S3上创建CORS配置。
我解决了自己。 我有三个缺点,现在纠正它们后效果很好。
首先 ,我将过期更改为政策。
'CloudFront-Expires' => expiry.utc.to_i,
至
'CloudFront-Policy' => safe_base64(raw_policy),
实际上,我曾使用过政策(自定义)而不是过期(罐装)。 在我尝试期间,我改变了。 但我不知道为什么到期版本不起作用。
其次 ,我的base_domain是'img.myapp.com',cookie_domain是'.myapp.com'。
第三 ,不要在最终网址上输入存储桶名称。 非常微不足道的错误,但很重要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.