【问题标题】:Unable to use signed cookies for cloudfront无法将签名 cookie 用于云端
【发布时间】:2017-04-21 10:24:25
【问题描述】:

我正在尝试将签名的 cookie 用于我的云端分发。

我使用cookie-signer 来生成签名cookie。 下面的脚本从云端获取文件

import requests
cookies = {
'CloudFront-Key-Pair-Id': 'APKXXXXXXXXXXX',
'CloudFront-Policy': u'eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kNXRpdXV2ZjdodDlpLmNsb3VkZnJvbnQubmV0L21lZGlhL3Byb2ZpbGVfcGljLmpwZyIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTQ5Mjc2ODcwMH19fV19',
'CloudFront-Signature': u'ZVG-Pi7x~edJqERf99O9und0wYedB-SHMNKuHd4UpEDaPckYekGoAJ~q8tU0vQI4mS9odXITzAKl4v7tmfDjG1y9FmWaSxgf9h2jrssIk25Mswk3UXOV7wRNs9DiHpA3~D70qAWXGS9GVN4z3SvZ3xQv9bM1P50y2shNPlOCV4o5nAH56sYdvdJNjxSFxdoOUMuhxyrzf-Gv5fjNSzv2Dy43WY6rmpEMfh6L9Eb-2kcrS9p5rsK9MtAwpN8Frobt4bCuduQleb~DXZ~O~hoBGdO3RdyYWgMdTa~02PQl3st8eisBiH7XYy2GbOwPIN~M4m-UAs3ihL0ZWUjbkVDFCA__',
'Secure': 'True',
'HTTPOnly': 'True',

}
headers = {}

s = requests.Session()

res = s.get('http://XXXXXXX.cloudfront.net/media/profile_pic.jpg', 
headers=headers, cookies=cookies)
print res
print res.content

输出:

 <Response [403]>
 <?xml version="1.0" encoding="UTF-8"?>
 <Error><Code>AccessDenied</Code><Message>Access Denied</Message>
 <RequestId>BBDBA8E7FEDA7759</RequestId><HostId>7Pt2/REdiugH5Te555/v004J6skQs9+ccncmXM74yHwPhQrSMJ9pavIj2QmPW6g2QsnnEYGxitc=</HostId></Error>

将用户添加到 Cloudfront 分发的可信签名者,并为 Cloudfront 生成密钥对 ID。

有人可以帮我解决这个问题吗? 提前致谢

【问题讨论】:

    标签: cookies amazon-cloudfront signed


    【解决方案1】:

    这对我有用,你的链接中的 GitHub 要点。过期时间需要以epoch秒为单位提供,传入的url必须是完整的CloudFront url(例如https://example.com/my/s3/object.png

    import datetime
    ex = datetime.datetime.utcnow() + datetime.timedelta(minutes=expire_min)
    c = create_signed_cookies(url, int(ex.strftime('%s')))
    

    您的 S3 存储桶策略需要允许来自分配给您的 CloudFront 分配的 CloudFront 源访问身份的 GetObject。

    {
        "Version": "2008-10-17",
        "Id": "PolicyForCloudFrontPrivateContent",
        "Statement": [
            {
                "Sid": "1",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXXXXX"
                },
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::my-bucket/*"
            }
        ]
    }
    

    您的密钥对 ID 需要参考您这样创建的一个(您必须以 root 帐户登录):https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-trusted-signers.html#private-content-creating-cloudfront-key-pairs-procedure

    【讨论】:

      【解决方案2】:

      您的错误实际上是 S3 错误,而不是 Cloudfront (CF) 错误。您是否创建了授予 GetObject 访问权限的存储桶策略?

      {
        "Version":"2012-10-17",
        "Statement":[
          {
            "Sid":"AddPerm",
            "Effect":"Allow",
            "Principal": "*",
            "Action":["s3:GetObject"],
            "Resource":["arn:aws:s3:::examplebucket/*"]
          }
        ]
      }
      

      http://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html

      如果您在 CF 中使用 S3 作为源,那么您需要创建一个源访问身份并确保在您的 S3 存储桶策略中授予对它的访问权限。 (见http://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html#example-bucket-policies-use-case-6

      如果您尝试使用 S3 静态 Web 托管服务页面,那么我建议在您的策略中将 Cloudfront IP 列入白名单或在 CF 中添加 Origin Custom Header,例如 referer,然后在您的存储桶策略中查找标头. (见http://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html#example-bucket-policies-use-case-4

      作为健全性检查,您可能希望尝试使用 AWS-CLI 生成签名 URL。 (见http://docs.aws.amazon.com/cli/latest/reference/cloudfront/sign.html

      【讨论】:

        猜你喜欢
        • 2021-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-16
        • 2021-11-07
        • 2012-04-13
        • 2012-10-18
        • 1970-01-01
        相关资源
        最近更新 更多