Ошибка при использовании пакета Метеор Slingshot с Google Cloud от localhost
Я пытаюсь создать небольшой раздел для загрузки на своем веб-сайте, чтобы пользователь мог загрузить изображение профиля. Я использую Slingshot с Google Cloud и тестирую это с localhost, но получаю следующие ошибки:
OPTIONS https://mybucket.storage.googleapis.com/ net::ERR_INSECURE_RESPONSE
Я полагаю, что эта ошибка из-за моей конфигурации CORS, поэтому я попробовал все виды различных настроек, и ничего не работает.
Это моя последняя установка CORS:
[
{
"origin": ["http://localhost:3000/"],
"responseHeader": ["Content-Type"],
"method": ["GET", "HEAD", "DELETE"],
"maxAgeSeconds": 3600
}
]
Я тоже так попробовал:
[
{
"origin": ["*"],
"responseHeader": ["*"],
"method": ["GET", "HEAD", "DELETE"],
"maxAgeSeconds": 3600
}
]
Еще ничего. Та же ошибка, что и раньше.
Это мой код сервера для Slingshot:
if(Meteor.isServer){
// Initiate file upload restrictions
Slingshot.fileRestrictions("userLogoUpload", {
//Only images are allowed
allowedFileTypes: ["image/png", "image/jpeg", "image/gif"],
//Maximum file size:
maxSize: 2 * 1024 * 1024 // 2 MB (null for unlimited)
});
// Google Cloud Directives
Slingshot.createDirective("userLogoUpload", Slingshot.GoogleCloud, {
bucket: Meteor.settings.public.GoogleCloudBucket,
GoogleAccessId: Meteor.settings.private.GoogleAccessId,
GoogleSecretKey: Assets.getText("xxxxxxxxxx.pem"),
// Uploaded files are publicly readable
acl: "public-read",
authorize: function(){
if(!Meteor.userId()){
throw new Meteor.error("Login Required", "Please log in to upload files");
}
return true;
},
key: function(file){
let user = Meteor.users.findOne(Meteor.userId());
return user.profile.username + "/" + file.name;
}
});
}
Вот инициация загрузки на стороне клиента:
let uploader = new Slingshot.Upload("userLogoUpload");
uploader.send(document.getElementById("upload").files[0], function(error, downloadUrl){
if(!error){
console.log(downloadUrl);
} else{
console.error('Error uploading', uploader.xhr.response);
console.log(error);
}
Все переменные проверены. Мой pem файл проверен и работает нормально. Так что должна быть ошибка либо с Google Cloud, либо с тем, как я настроил свой файл CORS.
Любая помощь будет оценена.
1 ответ
У меня была такая же проблема, но отладка была намного хуже. В моем Android-приложении загрузка работала нормально, но в iOS я получил ту же ошибку.
TLDR: не используйте точки в имени вашего сегмента (для псевдонима CNAME). Мой работал, когда переименован из gs://static.myapp.com
в gs://myapp-static
, Если нужен пользовательский домен, используйте ручной балансировщик нагрузки.
Полный рассказ
Мое ведро было названо static.myapp.com
чтобы я мог создать запись CNAME в своем провайдере DNS и обслуживать свои изображения с помощью настраиваемого домена.
Оказывается, сама загрузка происходит через URL https://<bucket-name>.storage.googleapis.com
с сертификатом SSL для подстановочного знака *.storage.googleapis.com
, поэтому я был вынужден переименовать ведро в myapp-static
поэтому URL соответствует сертификату.
Это нарушает подход CNAME, но вы все равно можете настроить балансировщик нагрузки вручную, чтобы скрыть URL-адрес Google Cloud и использовать собственный поддомен. Ниже приведен скриншот для моей текущей конфигурации балансировки нагрузки.