Облачное хранилище 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}`;
отлично работает!