Почему я могу отправлять запросы GraphQL из расширения Chrome Apollo, но не могу с помощью собственного расширения?

Я разрабатываю расширение Chrome, которое отправляет существующие запросы GraphQL на сайт.

Тестируя расширение Apollo Chrome, мне удалось правильно отправить запрос.

Но когда я делаю это через свой сценарий, я получаю ошибку аутентификации: «Пользователь не является администратором рабочей области».

Мой запрос вызывается из chrome.scripting.executeScript и ограничивается:

const doSomething = async () => {
    
    const query = JSON.stringify({
        query: `MY QUERY`
    });
    const response = await fetch(TARGET_URL, {
        headers: { 'content-type': 'application/json' },
        method: 'POST',
        body: query,
    });

    const responseJson = await response.json();
    console.info(responseJson);
    return responseJson.data;
};

chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {

    chrome.scripting.executeScript({
        target: { tabId: tabs[0].id },
        func: doSomething
    }, (result) => {
        console.info(result[0].result);
    });
});

const responseJson = await response.json();
console.info(responseJson);

Я думаю, что мне не хватает этапа аутентификации, но я не понимаю, почему у меня есть разница между расширением Apollo и моим.

Как Аполлону удается выполнить свою просьбу? Как я могу обновить свой сценарий, чтобы добиться чего-то подобного?

🤔 А знаете ли вы, что...
С помощью JavaScript можно валидировать данные на стороне клиента, что улучшает пользовательский опыт.


112
1

Ответ:

Решено

Как упомянул @phry, мы отправляем запрос через ваш экземпляр клиента Apollo, обнаруженный расширением Chrome (независимо от того, установлено ли значение window.__APOLLO_CLIENT__). Это означает, что запрос также пройдет через вашу цепочку ссылок , которая может включать некоторую логику для прикрепления заголовков аутентификации к запросу.

Глядя на ваш пример кода, я не вижу никакой дополнительной информации заголовка в вашем запросе fetch, поэтому этот запрос, скорее всего, не аутентифицируется таким же образом. Если вы хотите проверить, что отправляет экземпляр клиента Apollo вашего приложения, вы можете переопределить функцию выборки на HttpLink и зарегистрировать запрос.

createHttpLink({
  fetch: (uri, options) => {
    console.info(uri, options)

    return window.fetch(uri, options);
  }
})

// or if you use the constructor to create the link
new HttpLink({
  fetch: (uri, options) => {
    console.info(uri, options)

    return window.fetch(uri, options);
  }
})

Просто убедитесь, что функция fetch в вашем скрипте включает все необходимые заголовки аутентификации, которые вы видите здесь. Надеюсь это поможет!