Нет Access-Control-Allow-Origin с использованием настройки OneSignal

1

Я использую OneSignal для веб-push-сообщений для веб-сайта клиента. Я следил за настройкой HTTPS. Я несколько раз проверял, что все сделано правильно.

  • все файлы были загружены в корень домена
  • Я установил манифест и поместил нужный код инициализации в заголовок страницы

Когда я загружаю страницу, я получаю:

Fetch API cannot load https://onesignal.com/api/v1players. 
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'https://example.com' is therefore not allowed access. 
The response had HTTP status code 404. If an opaque response serves your needs, 
set the request mode to 'no-cors' to fetch the resource with CORS disabled.

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

Использование Chrome версии 58/Windows 10

Что я делаю неправильно?

Теги:
onesignal
cors

2 ответа

2
Лучший ответ

Ответы https://onesignal.com/api/v1players видимому, не включают заголовок ответа Access-Control-Allow-Origin, а поскольку они этого не делают, ваш браузер блокирует ваш внешний код JavaScript от доступа к ответам.

Нет никаких изменений, которые вы можете внести в свой собственный JavaScript-код frontend, а также настройки конфигурации бэкэнд, которые позволяют вашему внутреннему JavaScript-коду делать запросы так, как вы пытаетесь напрямую подключиться к https://onesignal.com/api/v1players и получать ответы обратно успешно.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS объясняет более подробно, но суть в том, что для CORS сервер, на который отправляется запрос, должен быть настроен для отправки Access-Control-Allow-Origin.

В любом случае https://documentation.onesignal.com/docs/web-push-sdk-setup-https имеет официальные документы, которые объясняют поддерживаемый SDK, что, по-видимому, требует от вас сделать что-то более похожее:

<head>
  <link rel="manifest" href="/manifest.json">
  <script src="https://cdn.onesignal.com/sdks/OneSignalSDK.js" async></script>
  <script>
    var OneSignal = window.OneSignal || [];
    OneSignal.push(["init", {
      appId: "YOUR_APP_ID",
      autoRegister: false,
      notifyButton: {
        enable: true /* Set to false to hide */
      }
    }]);
  </script>
</head>
  • 0
    Я просто использую их код. У меня на сайте тот же код (только что измененный), и он должен работать. Я просто использую их сервис самым простым способом. Он должен работать.
1

Принятый ответ в порядке, вы можете решить большинство требований, используя теги:

OneSignal.push(function() {
  /* These examples are all valid */
  OneSignal.sendTag("key", "value");

  OneSignal.sendTag("key", "value", function(tagsSent) {
    // Callback called when tags have finished sending
  });

  OneSignal.sendTag("key", "value").then(function(tagsSent) {
    // Callback called when tags have finished sending
  });  
});

Но если вы хотите отредактировать информацию об устройстве, на сегодняшний день нет способа редактировать метаданные устройства с помощью SDK WebPush. Мне нужно было периодически обновлять местоположение, и я не хотел использовать теги. Итак, я отправил запрос PUT на https://onesignal.com/api/v1players следующим образом:

function createCORSRequest(method, url) {
  var xhr = new XMLHttpRequest();
  if ("withCredentials" in xhr) {
    xhr.open(method, url, true);
  } else if (typeof XDomainRequest != "undefined") { //ie8 ie9
    xhr = new XDomainRequest();
    xhr.open(method, url);
  } else {
    xhr = null;
  }
  return xhr;
};

//then every time I needed to update the device
var url = 'https://onesignal.com/api/v1/players/' + playerId;
var xhr = createCORSRequest('PUT', url);
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");

xhr.onload = function() {}; //success
xhr.onerror = function() {}; //error

var deviceInfo = {
  "app_id": oneSignalAppId,
  "timezone": (currentDateTime.getTimezoneOffset()) * -60, //offset from utc
  //whatever fields you need to update
};

xhr.send(JSON.stringify(deviceInfo));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню