Облачное хранилище Google получит подпись от CDN npm

Я использую следующий код для создания подписанного 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.

});

Это создает URL, который начинается с https://storage.googleapis.com/my-bucket/

Если я размещу этот URL в браузере, он станет читабельным.

Тем не менее, я думаю, что URL является прямым доступом к файлу корзины и не проходит через мой настроенный CDN.

Я вижу, что в документах ( https://cloud.google.com/nodejs/docs/reference/storage/1.6.x/File) вы можете передать параметр cname, который преобразует URL для замены https://storage.googleapis.com/my-bucket/ к моему ведру CDN.

ОДНАКО, когда я копирую полученный URL-адрес, учетная запись службы или полученный URL-адрес, кажется, не имеют доступа к ресурсу.

Я добавил учетную запись службы администрирования Firebase в корзину, но все равно не получил доступа.

Кроме того, в документах URL-адрес, подписанный CDN, кажется, сильно отличается от URL-адреса, подписанного через этот API. Можно ли создать из API URL-адрес со знаком CDN, или я должен вручную создать его, как описано в: https://cloud.google.com/cdn/docs/using-signed-urls?hl=en_US&_ga=2.131493069.-352689337.1519430995?

3 ответа

Решение

Для всех, кто интересуется кодом узла для этой подписи:

    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;

Облачная сеть доставки контента CDN работает с балансировкой нагрузки HTTP(S) для доставки контента вашим пользователям. Используете ли вы HTTPS Load Balancer для доставки контента своим пользователям? Вы можете увидеть этот прикрепленный документ [1] об использовании Google Cloud CDN и балансировке нагрузки HTTP(S) и вставке контента в кеш.

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

Какой код ошибки вы получаете? Можете ли вы использовать команду curl и отправить вывод с кодом ошибки для дальнейшего анализа.

Не могли бы вы подтвердить, что выполненная вами конфигурация соответствует требованию кешируемости, поскольку не все HTTP-ответы кешируются? Google Cloud CDN кэширует только те ответы, которые удовлетворяют определенным условиям [3], пожалуйста, подтвердите. После подтверждения я проведу дополнительное расследование и сообщу вам об этом.

[3] Кешируемость: https://cloud.google.com/cdn/docs/caching

Не могли бы вы предоставить мне вывод этих двух команд ниже, которые помогут мне проверить, есть ли проблема с разрешениями для этих объектов? Эти команды сбросят все текущие настройки разрешений для объекта.

gsutil acl get gs: // [full_path_to_file_to_be_cached] gsutil ls -L gs: // [full_path_to_file_to_be_cached]

Для получения более подробной информации о разрешении, обратитесь к этой документации GCP [4]

[4] Настройка прав доступа к корзине: https://cloud.google.com/storage/docs/cloud-console

Нет, из API невозможно создать подписанный CDN URL

Из того, что документы Google здесь . Ответ, предоставленный @htafoya, кажется законным. Тем не менее, я потратил пару часов, чтобы понять, почему подписанный URL-адрес не работает, поскольку конечная точка CDN жалуется на отказ в доступе. В конце концов я нашел код, используя cryptoмодуль не производит такое же хеш-значение hmac-sha1, как то, что gcloud compute sign-urlвычислено, я до сих пор не знаю, почему.

В то же время я вижу, что эта библиотека (jsSHA) довольно крутая, она генерирует хеш-значение HMAC-SHA1 точно так же, как gcloudи у него есть аккуратный API, поэтому я думаю, что я должен прокомментировать здесь, чтобы, если другие столкнутся с такой же проблемой, они выиграют от этого, это окончательный код, который я использовал для подписи URL-адреса gcloud cdn:

          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}`;

отлично работает!