使用带有签名 Cookie 的 Cloudfront 时出现访问被拒绝错误

问题描述 投票:0回答:1

我知道这个话题已经在互联网上被多次询问和回答,但不幸的是,尽管我尝试了基本上每一个相关的帖子,但我仍然遇到问题!

我的设置

我有一个 S3 存储桶,其中包含用于 前端流媒体服务的视频文件。这些文件通过 CloudFront Distribution 提供服务,为了保护文件访问,我设置了一个 API Gateway,它将请求重定向到 Custom Lambda 以获取我的 CloudFront Signed Cookies

但是,各个服务的测试均成功:

  • 将 S3 访问权限设置为 public 并直接从 S3 请求
    *.m3u8
    视频清单可按预期工作 (流就像魅力一样)。
  • 为我的 Cloudfront 发行版设置自定义 SSL 证书(以避免 CORS),并通过 CloudFront 请求相同的文件也可以。
  • 由于我的前端需要访问 S3 上的
  • 整个文件夹(用于流式传输),唯一的方法 - 至少据我所知 - 是对请求使用签名的 cookie。因此,我设置了一个 Custom Lambda,它返回 CloudFront 域的 Set-Cookie 标头。
    为了返回
  • 自定义标头
  • ,我们需要设置一个API网关并将其链接到lambda。
我想强调,
S3

CloudFrontLambdaAPI网关可以单独工作,但前提是我不将cookie附加到请求中!

所以我猜测 cookie 的签名有问题。

自定义 Lambda

由于 lambda 是 cookie 签名的真实来源,我将展示我在这里所做的一个最小示例。我的 lambda 是用

Node JS

编写的,我正在使用

"@aws-sdk/cloudfront-signer": "^3.229.0",
const url = `https://my-cloudfront.domian.com/path-to-src/*`;
const expTime = new Date(Date.now() + 5 * (60 * 60 * 1000)).toISOString();

const signedCookie = getSignedCookies({
  keyPairId: awsCloudfrontKeyPairId,    // from CloudFront setup
  privateKey: awsCloudfrontPrivateKey,  // from CloudFront setup
  url: url,
  dateLessThan: getExpTime,
});

const response = {
  statusCode: 200,
  isBase64Encoded: false,
  body: JSON.stringify({ url: url, bucket: bucket, key: key }),
  headers: {
    "Content-Type": "application/json",
    "Access-Control-Allow-Origin": "*",
    "Access-Control-Allow-Credentials": true,
    "Access-Control-Allow-Methods": "OPTIONS,POST,GET",
  },
  multiValueHeaders: {
    "Set-Cookie": [
      `CloudFront-Expires=${signedCookie["CloudFront-Expires"]}; Domain=domain.com; Path=/*`,
      `CloudFront-Signature=${signedCookie["CloudFront-Signature"]}; Domain=domain.com; Path=/*`,
      `CloudFront-Key-Pair-Id=${signedCookie["CloudFront-Key-Pair-Id"]}; Domain=domain.com; Path=/*`,
    ],
  },
};

callback(null, response);

这有效,我得到了 3 个 
Set-Cookie

标头,这些标头在请求文件时也会被提交。然而,结果总是一样的:

ACCESS DENIED

测试

为了测试各个服务,我执行了以下操作:

仅限 S3 --> 流式工作
  • 没有
  • viewer restriction
  • 的 CloudFront --> 流可以工作
    CloudFront 带有 
  • viewer restriction
  • 没有 cookies
    --> Missing Key 错误
    CloudFront 与 
  • viewer restriction
  • 和 cookies -->
    Access Denied
    错误
    
    
  • 显然还有很多更重要的设置步骤
(例如存储桶策略、自定义域等)

,我在这里没有提及,但如果需要,可以根据要求发布。 这个话题让我忙了一个月了!任何帮助表示赞赏! 🙌

amazon-web-services cookies amazon-cloudfront
1个回答
0
投票

我上面的示例通过

自定义策略 签署 Cookie,但使用 罐装策略

中的 Set-Cookie 标头键。文档中的差异并不是很明显,但很明显......
但是,而不是

Set-Cookie: CloudFront-Expires= ...

你使用

Set-Cookie: CloudFront-Policy=<your policy string>

钥匙

Set-Cookie: CloudFront-Expires= ... Set-Cookie: CloudFront-Signature= ...

完全相同。

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.