Не удалось устранить ошибку CORS в защищенной облачной функции Google - PullRequest
0 голосов
/ 15 марта 2020

У меня есть функция Google Cloud. Я создал учетные данные для своего проекта и авторизовал http://localhost & http://localhost: 3000 в качестве источника. У меня также есть учетная запись пользователя Google, которой я назначил роль cloudfunctions.functions.invoke. Я подтверждаю это, перейдя в облачную функцию в консоли и развернув пункт «Cloud Functions Invoker» и увидев там свою учетную запись.

Я могу успешно получить доступ к функции с помощью curl.

curl https: // [google-cloud-server] / test5 -H "Авторизация: токен my-identity-bearer"

Однако, если я пытаюсь вызвать функция из моего приложения React (я пробовал и топор ios и выборку), я получаю следующую ошибку ....

Доступ к XMLHttpRequest по адресу https: // [google -cloud-server] / test5? a = b 'from origin' http://localhost: 3000 'заблокирован политикой CORS: Ответ на запрос перед полетом не проходит проверку контроля доступа: Нет Заголовок «Access-Control-Allow-Origin» присутствует в запрашиваемом ресурсе.

Несколько замечаний ...

  1. Если я не возникну проблем с CORS сделать функцию доступной для всех пользователей
  2. Посредством регистрации я подтвердил, что, будучи защищенным, запрос никогда не делает это функция, где у меня есть код CORS для проверки перед полетом. Это имеет смысл, так как он должен быть защищен Google. Но вся документация, которую я нахожу в функциях Google Cloud, рассказывает о работе с CORS-компонентами внутри функции. Что-то отвечает на запрос моего приложения React до того, как он достигнет моей функции. Я понятия не имею, что / где.

Я добавил так много тегов к этому сообщению, потому что я действительно не знаю, какой слой вызывает проблему. Я, вероятно, делаю что-то действительно очевидное / глупое, но у меня нет идей!

Облачная функция ....

exports.test5 = (req, res) => {

  console.log('function invoked');
  // Set CORS headers for preflight requests
  // Allows GETs from any origin with the Content-Type header
  // and caches preflight response for 3600s

  res.set('Access-Control-Allow-Origin', '*');

  if (req.method === 'OPTIONS') {
    console.log('Determined it is OPTIONS request');
    // Send response to OPTIONS requests
    res.set('Access-Control-Allow-Methods', 'GET');
    res.set('Access-Control-Allow-Headers', 'Authorization');
    res.set('Access-Control-Max-Age', '3600');
    res.status(204).send('');
  } else {

    console.log('Main function body');
    res.send('Hello World!');
  }
};

Вызов из клиента React ...

  const config = 
  {
    params: payload,
    headers: 
    { 
      Authorization: `bearer ${window.IDENTITY_TOKEN}`
    }
  };

  axios.get(url, config)
      .then((res) => {
          ...

      })
      .catch((err) => {
          handleError(err);
      });

Есть идеи? Спасибо

1 Ответ

2 голосов
/ 15 марта 2020

В запросе CORS preflight OPTION отсутствует заголовок авторизации и облачные функции. IAM предварительно проверяет заголовок авторизации и не будет вызывать функцию, если она отсутствует. Поэтому для обслуживания ответа предварительной проверки CORS вы должны разрешить всем пользователям доступ к вашему облаку. функция.

Редактировать

Они обновили документацию

Если вы хотите создать веб-приложение, защищенное с помощью входа в Google и Cloud Functions IAM, вам, вероятно, придется иметь дело с распределением ресурсов между источниками (CORS). Предварительные запросы CORS отправляются без заголовка авторизации, поэтому они будут отклонены для всех неопубликованных c функций HTTP. Поскольку предварительные запросы не выполняются, основной запрос также не выполняется.

Чтобы обойти это, вы можете разместить свое веб-приложение и функции в одном домене, чтобы избежать предварительных запросов CORS. В противном случае вам следует опубликовать свои функции c и обрабатывать CORS и аутентификацию в коде функции.

В качестве альтернативы вы можете развернуть прокси-сервер Cloud Endpoints и включить CORS. Если вам нужны возможности аутентификации, вы также можете включить проверку токенов Google ID, которая будет проверять те же токены аутентификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...