问题描述
我正在尝试通过 Google Cloud CDN 使 hls/dash 流工作以实现视频点播解决方案。文件/清单位于 Google Cloud Storage Bucket 中,一切看起来都配置正确,因为我遵循了文档 https://cloud.google.com/cdn/docs/using-signed-cookies 的每一步。
现在我使用 Google Cloud CDN signed cookies with bucket as backend 中的等效 Node.js 代码创建一个签名 cookie,其中包含我之前在 google cloud 中设置的正确签名密钥名称和值。 Cookie 已发送到我在 Google Cloud 中的负载平衡器后端。
遗憾的是,我总是收到 403 响应,说 <?xml version='1.0' encoding='UTF-8'?><Error><Code>AccessDenied</Code><Message>Access denied.</Message></Error>
。
更多信息:
- 签名的 url/cookie 在负载均衡器后端被激活
- cdn-account 的存储桶中的 IAM 角色设置为“objectViewer”
- 签名密钥被创建、保存并用于对 cookie 进行签名
非常感谢您对此的任何帮助。
编辑: 我只是尝试了 google 声明的确切 python 代码,以使用以下参数从 https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/cdn/snippets.py 创建签名 cookie:
调用:sign_cookie('http://cdn.myurl.com/','mykeyname','mybase64encodedkey',1614110180545)
密钥是直接从谷歌复制的,因为我是在那里生成的。
负载均衡器日志写入 invalid_signed_cookie
。
解决方法
我遇到了同样的问题。 奇怪的是,它仅在 Web 浏览器中不能正常工作。我见过 GoolgeChrome 和 Safari 返回 403,即使它们包含 cookie。但是,我注意到 curl 中具有完全相同 cookie 的相同请求返回 200。我认为这意味着它在 Web 浏览器中无法正常工作。我现在正在就此事向 GCP 支持人员咨询,但没有得到好的答复。
编辑: 经过几次假设和测试,我发现我使用的cookie库在使用格式并在Set-Cookie头中插入值时,会自动执行URLEncoding并发送CloudCDN无法理解的cookie。因此,Web 浏览器现在可以通过将内容添加到 Set-Cookie 标头而不使用 URLEnconding 来检索内容。