拒绝访问(403)来自AWS Cloudfront Signed Cookie on Rails支持的应用程序

时间:2015-06-24 03:44:41

标签: ruby-on-rails amazon-web-services amazon-s3 amazon-cloudfront amazon-signed-cookie

我为此尝试了一整天,但我不能......

一个。我创建了一个用于创建签名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。我从randalv获得了适当资源的帮助。

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

℃。来自A& B,Cloudfront的三个验证通过 - 1.三个cookie现有验证,和2.到期现有验证,3。解码可用验证。由于无效请求上的错误消息,我知道这三个验证。但毕竟,我总是得到同样的信息 - 拒绝访问。

有一些嫌犯。

  1. 我的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) 。
    但是All Denied。

  2. 我的Cloudfront& S3设置与randalv上的设置相同。但我介意两件事。在Cloudfront的原始设置中,“限制存储桶访问”为“否”。我不在S3上创建CORS配置。

1 个答案:

答案 0 :(得分:3)

我解决了自己。 我有三个缺点,现在纠正它们后效果很好。

首先,我更改了到期政策。

'CloudFront-Expires' => expiry.utc.to_i,

'CloudFront-Policy' => safe_base64(raw_policy),

实际上,我曾使用过策略(自定义)而非过期(罐装)。在我尝试期间,我改变了。但我不知道为什么到期版本不起作用。

第二次,我的base_domain是'img.myapp.com',cookie_domain是'.myapp.com'。

第三次,请勿在最终网址上输入存储桶名称。非常微不足道的错误,但很重要。