Ошибка при использовании пакета Метеор 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 и использовать собственный поддомен. Ниже приведен скриншот для моей текущей конфигурации балансировки нагрузки.

Другие вопросы по тегам