代码之家  ›  专栏  ›  技术社区  ›  htafoya

Google云存储从CDN npm获得signedUrl

  •  0
  • htafoya  · 技术社区  · 6 年前

    我使用以下代码为我的内容创建签名Url:

    var storage = require('@google-cloud/storage')();
    var myBucket = storage.bucket('my-bucket');
    var file = myBucket.file('my-file');
    
    //-
    // Generate a URL that allows temporary access to download your file.
    //-
    var request = require('request');
    
    var config = {
      action: 'read',
      expires: '03-17-2025'
    };
    
    file.getSignedUrl(config, function(err, url) {
      if (err) {
        console.error(err);
        return;
      }
    
      // The file is now available to read from the URL.
    
    });
    

    这将创建一个以 https://storage.googleapis.com/my-bucket/

    如果我把这个网址放在浏览器里,它是可读的。

    但是,我猜URL是对bucket文件的直接访问,并没有通过我配置的CDN。

    我在文件里看到了( https://cloud.google.com/nodejs/docs/reference/storage/1.6.x/File#getSignedUrl )您可以传递cname选项,该选项将url转换为replace 我的桶CDN。

    但是,当我复制结果URL时,服务帐户或结果URL似乎无法访问该资源。

    https://cloud.google.com/cdn/docs/using-signed-urls?hl=en_US&_ga=2.131493069.-352689337.1519430995#configuring_google_cloud_storage_permissions ?

    2 回复  |  直到 6 年前
        1
  •  2
  •   htafoya    6 年前

        var url = 'URL of the endpoint served by Cloud CDN';
        var key_name = 'Name of the signing key added to the Google Cloud Storage bucket or service';
        var key = 'Signing key as urlsafe base64 encoded string';
        var expiration = Math.round(new Date().getTime()/1000) + 600; //ten minutes after, in seconds
    
        var crypto = require("crypto");
        var URLSafeBase64 = require('urlsafe-base64');
    
        // Decode the URL safe base64 encode key
        var decoded_key = URLSafeBase64.decode(key);
    
        // buILD URL
        var urlToSign = url 
                + (url.indexOf('?') > -1 ? "&" : "?")
                + "Expires=" + expiration
                + "&KeyName=" + key_name;
    
        //Sign the url using the key and url safe base64 encode the signature
        var hmac = crypto.createHmac('sha1', decoded_key); 
        var signature = hmac.update(urlToSign).digest();
        var encoded_signature = URLSafeBase64.encode(signature);
    
        //Concatenate the URL and encoded signature
        urlToSign += "&Signature=" + encoded_signature;
    
        2
  •  0
  •   Muhammad Ebaduddin    6 年前

    [1] https://cloud.google.com/cdn/docs/overview [2] https://cloud.google.com/cdn/docs/concepts

    你得到了什么错误码?您是否可以使用curl命令并将输出与错误代码一起发送以供进一步分析。

    [3] 可缓存性: https://cloud.google.com/cdn/docs/caching#cacheability

    你能给我下面这两个命令的输出吗,这将帮助我验证这些对象上是否有权限问题?这些命令将转储对象上的所有当前权限设置。

    gsutil ls-L gs://[文件的完整路径被缓存]

    有关许可的更多详细信息,请参阅GCP文档[4]

    [4] 设置bucket权限: https://cloud.google.com/storage/docs/cloud-console#_bucketpermission

    不,无法从API创建CDN签名的URL

        3
  •  0
  •   Shawn Cao    4 年前

    从谷歌的文档中 here 然而,我花了几个小时来思考为什么签名的URL不能作为CDN端点工作,却抱怨访问被拒绝。最终我发现代码使用 crypto gcloud compute sign-url

    同时,我明白了 this lib (jsSHA)非常酷,它生成的HMAC-SHA1哈希值与 gcloud 而且它有一个整洁的API,所以我想我应该在这里发表评论,这样如果其他人也有同样的挣扎将从中受益,这是我用来签署gcloud cdn URL的最后一个代码:

        import jsSHA from 'jssha';
        const url = `https://{domain}/{path}`;
        const expire = Math.round(new Date().getTime() / 1000) + daySeconds;
      const extendedUrl = `${url}${url.indexOf('?') > -1 ? "&" : "?"}Expires=${expire}&KeyName=${keyName}`;
    
      // use jssha
      const shaObj = new jsSHA("SHA-1", "TEXT", { hmacKey: { value: signKey, format: "B64" } });
      shaObj.update(extendedUrl);
      const signature = safeSign(shaObj.getHMAC('B64'));
      return `${extendedUrl}&Signature=${signature}`;
    

    工作太好了!