Как я могу удалить предупреждение CORB? - PullRequest
3 голосов
/ 14 марта 2019

Chrome работал до версии 73. Теперь он выдает мне предупреждение CORB и останавливает работу моего расширения Chrome.

Вот мой jjery-код ajax, ничего особенного

  $.ajax({
    url: this.url + "api/users",
    type: 'get',
    data: { account_id: this.account_id(), user_id: this.user_id(), person_id: person_id },
    success: function (data) {
      //do stuff
    }
});

Я заметил, что если я удалю заголовок x-content-type-options, чтобы он больше не читал "nosniff", яможет получить некоторые запросы Ajax, но не другие.Не уверен, что это что-то значит, но я заметил, что запросы json, которые возвращали массив, работали, а другие - нет.

remove_keys = %w(X-Content-Type-Options)
response.headers.delete_if{|key| remove_keys.include? key}

[{'id' : '123'}] <-worked
{'id' : '123'} <- did not work (not sure if means anything)

Полная ошибка из Chrome

Cross-Origin Read Blocking (CORB) blocked cross-origin response https://ideas.test/api/users?token=W9BDdoiKcXLWSHXWySnwdCV69jz2y&account_id=3098355&user_id=john%40gmail.com&person_id=21046915&sync=false&new=true with MIME type application/json. See https://www.chromestatus.com/feature/5629709824032768 for more details.

Заголовки из ответа

Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: x-auth_token
Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD
Access-Control-Allow-Origin: chrome-extension://mhikhjencpecbhelhjgdcgpdhlhdlhjh
Access-Control-Expose-Headers: 
Access-Control-Max-Age: 1728000

Запрос заголовков

Provisional headers are shown
Accept: */*
Origin: chrome-extension://mhikhjencpecbhelhjgdcgpdhlhdlhjh
Referer: https://3.basecamp.com/
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36

Как получитьтело ответа должно быть возвращено без удаления хрома из-за CORB?

Ответы [ 4 ]

1 голос
/ 15 марта 2019

Я нашел обходной путь.Это может быть излишним для кого-то, но мне потребовалось 15 минут, чтобы все исправить.В вашем скрипте контента оберните все ваши вызовы ajax в функцию:

Добавьте функцию ajaxGet в ваш скрипт контента:

function ajaxGet(data){
    return new Promise(function (resolve, reject) {
        chrome.runtime.sendMessage({action: 'ajaxGet', data: data}, function (response) {
            console.log(response)
            if(response&&!response.statusText){//Might need some work here
                resolve(response);
            } else {
                reject(response)
            }
        });
    });
}

И в вашем background.js добавьте слушатель:

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
   if(request.action=="ajaxGet"){
       $.ajax(request.data).then(sendResponse,sendResponse)
       return true //telling chrome to wait till your ajax call resolves
   }
})

вместо

$.ajax({
    url: this.url + "api/user_boards",
    type: 'get',
    data: { account_id: this.account_id()}
}) 

call

ajaxGet({
    url: this.url + "api/user_boards",
    type: 'get',
    data: { account_id: this.account_id()}
}).then(onSuccess, onError) //handle response from here

Если вы не хотите использовать jquery в своем background.js, вы можете сделать вызов Xhr вместо него.Примерно так:

var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
    sendResponse(this.responseText)
  } else {
    //handle errors
  }
});

xhr.open("GET", request.data.url);

xhr.send(data);

Вам придется самостоятельно обходить заголовки.

1 голос
/ 14 марта 2019

Похоже, вы помещаете заголовки CORS в запрос. Вместо этого вам нужно указать их в ответе.

0 голосов
/ 17 июня 2019

После исправления проблем CSP & CORS я все еще получал предупреждение о вызове метода OPTIONS (который делается для междоменных вызовов).

Я исправил это на сервере, установив тип содержимого для вызова метода OPTIONS (который не возвращает никаких данных) в «application / octet-stream». Больше никаких предупреждений!

0 голосов
/ 30 марта 2019

Chrome 73 привносит новую безопасность. Просто попробуйте переместить ваши запросы xHTTP в фоновый скрипт с помощью chrome.runtime.sendMessage и получить ответ с помощью SendResponse обратного вызова.

В скрипте содержимого или всплывающего окна замените ajax на:

chrome.runtime.sendMessage(
  { action: "check", data: {/* params for url */}}, 
  // callback with url response
  function(response) {
    if( response.success ) {
      var myDataFromUrl = response.data;
      ...
    } else {
      console.log('Error with `check`,', response.data);
    }
  }
);

Из фонового скрипта:

chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    var url = 'https://mysyte.com/';
    if(request.action === 'check' ) {
      url = url + 'check'
      ajax( url, request.data, 
        success: function( d ) {
          sendResponse({success: true, data: d});
        },
        error : function( d ) {
          sendResponse({success: false, data: d});
        }
      );
    }
});

function ajax( url, params, cbSuccess, cbError ) { ... }
...