0

在谷歌中,图像以 CDN URL 类型托管,我尝试从该 CDN 下载图像,但它在 C# 中引发错误。使用了下面附加的这个 c# 代码。

          using (var webClient = new WebClient())
            {
                byte[] imageBytes = webClient.DownloadData(imageUUl);
                System.IO.File.WriteAllBytes(@"E:\Temp\img2.jpeg", imageBytes);
            }

网址:https ://lh6.googleusercontent.com/vpsleVfq12ZnALrwbIUqCTa0Fpqa5C8IUViGkESOSqvHshQpKCyOq4wsRfTcadG2WYgcW3m0yq_6M2l_IrSM3qr35spIML9iyIHEULwRu4mWw4CUjCwpVfiWnd5MXPImMw=w1280

提前致谢。

4

2 回答 2

1

在 GCP Cloud CDN 中,您可以使用带有身份验证的签名 URL 或签名 cookie 来授权用户并为他们提供访问受保护内容的限时令牌,因此 Cloud CDN 不会阻止没有签名查询参数或 Cloud- CDN-Cookie HTTP cookie。它拒绝具有无效(或其他格式错误)请求参数的请求,因此我建议检查您的浏览器客户端安全设置;如何将身份验证管理到您的 CDN URL。如果安全策略允许,一些客户端默认存储 cookie,还要检查您的 CDN URL 安全入口是如何配置的,因为当您使用带有签名 cookie 的 CDN URL 时,对签名和未签名请求的响应会分别缓存,因此成功响应一个有效的签名请求永远不会用于服务一个未签名的请求。

  • 确保已启用 Cloud CDN。

  • 如有必要,请更新到最新版本的 Google Cloud CLI:

                   `gcloud components update`
    
  • 为您的签名 URL 创建密钥

    要创建密钥,请按照以下步骤操作。

          1.In the Google Cloud Console, go to the Cloud CDN page.
          2.Click Add origin. 
          3.Select an HTTP(S) load balancer as the origin.
          4.Select backend services or backend buckets. For each one
    
             -Click Configure, and then click Add signing key.
    
             -Under Name, give the new signing key a name.
    
             -Under the Key creation method, select Automatically generate or Let me enter.
    
            - If you're entering your own key, type the key into the text field.
    
            - Click Done.
    
            - Under Cache entry maximum age, provide a value, and select a Unit of time from the drop-down list. You can choose among second, minute, hour, and day. The maximum amount of time is three (3) days.
    
         5. Click Save.
         6. Click Add.
    
  • 配置云存储权限。

在运行以下命令之前,至少向项目中的后端存储桶添加一个密钥;否则,该命令将失败并出现错误,因为在您为项目添加一个或多个密钥之前,不会创建 Cloud CDN 缓存填充服务帐户。将 PROJECT_NUM 替换为您的项目编号,将 BUCKET 替换为您的存储桶。

gsutil iam ch \ serviceAccount:service-PROJECT_NUM@cloud-cdn-fill.iam.gserviceaccount.com:objectViewer \ gs://BUCKET

  • 列出后端服务或后端存储桶上的密钥,运行以下命令之一:

    gcloud compute backend-services describe BACKEND_NAME

    gcloud compute backend-buckets describe BACKEND_NAME

  • 签署 URL 并分发它们。

gcloud compute sign-url您可以使用命令或使用您自己编写的代码对URL 进行签名 。如果您需要许多签名 URL,自定义代码可以提供更好的性能。此命令从 读取并解码 base64url 编码的密钥值KEY_FILE_NAME,然后输出一个签名的 URL,您可以将其用于给定 URL 的 GET 或 HEAD 请求。

gcloud compute sign-url \
  "https://example.com/media/video.mp4" \
  --key-name my-test-key \
  --expires-in 30m \
  --key-file sign-url-key-file

在此链接中,您可以找到与签名 URL 和签名 cookie 相关的更多信息。

于 2022-02-15T22:24:33.897 回答
0

您不能以这种方式下载图像,因为您需要提供OAuth 令牌。并且您需要启用配置文件范围

    var GoogleAuth; // Google Auth object.
function initClient() {
  gapi.client.init({
      'apiKey': 'YOUR_API_KEY',
      'clientId': 'YOUR_CLIENT_ID',
      'scope': 'https://www.googleapis.com/auth/userinfo.profile',
      'discoveryDocs': ['https://discovery.googleapis.com/discovery/v1/apis']
  }).then(function () {
      GoogleAuth = gapi.auth2.getAuthInstance();

      // Listen for sign-in state changes.
      GoogleAuth.isSignedIn.listen(updateSigninStatus);
  });
}
于 2022-02-15T01:22:59.703 回答