我知道这个话题已经在互联网上被多次询问和回答,但不幸的是,尽管我尝试了基本上每一个相关的帖子,但我仍然遇到问题!
我有一个 S3 存储桶,其中包含用于 前端流媒体服务的视频文件。这些文件通过 CloudFront Distribution 提供服务,为了保护文件访问,我设置了一个 API Gateway,它将请求重定向到 Custom Lambda 以获取我的 CloudFront Signed Cookies。
但是,各个服务的测试均成功:
*.m3u8
视频清单可按预期工作 (流就像魅力一样)。Set-Cookie
标头。为了返回S3、CloudFront、Lambda和API网关可以单独工作,但前提是我不将cookie附加到请求中!
所以我猜测 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
viewer restriction
没有 cookies-->
Missing Key
错误CloudFront 与 viewer restriction
Access Denied
错误
,我在这里没有提及,但如果需要,可以根据要求发布。 这个话题让我忙了一个月了!任何帮助表示赞赏! 🙌
我上面的示例通过
自定义策略 签署 Cookie,但使用 罐装策略
中的Set-Cookie
标头键。文档中的差异并不是很明显,但很明显......
但是,而不是
Set-Cookie: CloudFront-Expires= ...
你使用
Set-Cookie: CloudFront-Policy=<your policy string>
钥匙
Set-Cookie: CloudFront-Expires= ...
Set-Cookie: CloudFront-Signature= ...
完全相同。
希望这有帮助!