Cloud CDN 签名 URL:您的客户端无权从此服务器获取 URL /pathToFile/sample.mp3

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

我正在使用 Cloud CDN 向我的应用程序私下提供文件。我的应用程序调用一个云函数,该函数将生成签名的 URL 并将其返回以供访问。我的负载均衡器与后端存储桶连接。我正在使用下面的脚本来签署网址:

const url = new URL(`https://cdn.mydomain.com/${filePathAndName}`);
      const expires = Math.floor(Date.now() / 1000) + 60 * 60; //expires in 60 seconds

      const urlToSign = `${url.pathname}?Expires=${expires}&KeyName=key1`;
      const signature = crypto
        .createHmac("sha1", Buffer.from("generatedKey", "base64"))
        .update(urlToSign)
        .digest("base64")
        .replace(/\+/g, "-")
        .replace(/\//g, "_")
        .replace(/=+$/, "");

      url.searchParams.append("Expires", expires.toString());
      url.searchParams.append("KeyName", "key1");
      url.searchParams.append("Signature", signature);

      response.json({ url: url.toString()});

然后当我尝试访问该链接时,它会抛出错误

Your client does not have permission to get URL /pathToFile/sample.mp3 from this server.

有人知道如何解决这个问题吗?我的存储桶是私有的,但我向 CDN 服务帐户授予了查看者权限。如果我使用生成的密钥 (key1) 对 url 进行签名,只要链接有效,任何人都不能访问该文件吗?

提前谢谢您!

node.js google-cloud-platform google-cloud-storage pre-signed-url google-cloud-cdn
1个回答
0
投票

我设法解决了这个问题。事实上我的存储桶是私有的并且启用了阻止公共访问并不是问题。我确保 CDN 的服务帐户已添加为 Storage Object Viewer,以便 CDN 可以访问存储桶。我的签名链接的问题是

urlToSign
变量。

const urlToSign = `${url.pathname}?Expires=${expires}&KeyName=key1`;

上面生成了这样的 url:

/pathToFile/sample.mp3?Expires=1734744212&KeyName=key1
,但是您签名的 url 需要与最终 url 匹配,并且甚至必须包含
https://
部分。

因此,为了完成这项工作,我所要做的就是将

urlToSign
变量更改为

const urlToSign = `https://cdn.mydomain.com${url.pathname}?Expires=${expires}&KeyName=key1`;

我希望这可以帮助其他可能遇到同样问题的人。签名非常敏感,因此请确保每个字符都是准确的。它甚至不能有额外的

/
或任何与最终 URL 不同的内容。
urlToSign
需要与最终的 url 看起来相同,但没有在末尾添加的签名参数。

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