使用 Google Cloud CDN 签名的 Cookie 以 403 响应

问题描述

我正在尝试通过 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 支持人员咨询,但没有得到好的答复。 screenshot

编辑: 经过几次假设和测试,我发现我使用的cookie库在使用格式并在Set-Cookie头中插入值时,会自动执行URLEncoding并发送CloudCDN无法理解的cookie。因此,Web 浏览器现在可以通过将内容添加到 Set-Cookie 标头而不使用 URLEnconding 来检索内容。