Попытка перенаправить клиента в Google OAuth, ошибка 405

Я пытаюсь создать веб-службу, которая подключается к API Календаря Google. Пытаясь авторизовать мое приложение, я создал URL с необходимыми областями действия. Проблема в том, что когда я пытаюсь перенаправить клиента на сгенерированный URL-адрес, я получаю сообщение об ошибке 405 со следующим сообщением:

Ответ на запрос предварительной проверки не проходит проверку контроля доступа: в запрошенном ресурсе отсутствует заголовок "Access-Control-Allow-Origin". Источник ' http://localhost:8080/', следовательно, не имеет доступа. Ответ имел HTTP-код состояния 405.

По большей части я следовал этому руководству: https://developers.google.com/identity/protocols/OAuth2WebServer с использованием клиентской библиотеки node.js.

Из того, что я понимаю, похоже, что Google не настроил свой сервер для приема запросов из разных источников, что я не понимаю, так это как я должен перенаправлять своих пользователей на их страницу авторизации, если я не могу отправить запрос со своего домена.

Вот соответствующий код:

export function authorize(req, res, callback): any {
  let auth = new googleAuth();
  let oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl);
  if (// Check if we have previously stored a token.) {
    oauth2Client.credentials = //get token;
    callback(oauth2Client);
  } else {
    //redirect to google authentication page
    let authUrl = oauth2Client.generateAuthUrl({
      access_type: 'offline',
      state: '/',
      scope: SCOPES
    });
    res.redirect(authUrl);
  }
}

3 ответа

Оказывается, когда AJAX получает код состояния 300, браузер автоматически отправляет другой запрос GET в возвращенное местоположение от имени клиента. Даже если бы я справился с проблемой CORS, мне пришлось бы вручную загружать html-страницу, так как запрос был сделан от имени клиента. Что я действительно хочу, чтобы браузер сделал запрос к auth uri.

Поэтому мое решение этой проблемы состоит в том, чтобы обнаружить перенаправления на внешнем интерфейсе и заставить браузер выдавать совершенно новый запрос GET. Похоже, это обходной путь, поэтому, если у кого-то есть лучшее решение, я бы хотел услышать его.

Если кто-то использует React или подобный SPA Framework для решения этой проблемы, связанной с OAuth 2, прочитайте это:

Не перенаправляйте на стороне сервера. Не делайте этого (node.js / express в качестве примера бэкенда):

router.get('/go', errorHandler(async (req, res, next) => {
    res.redirect(authenticationUrl);
})
);

СДЕЛАЙ ЭТО:

router.get('/go', errorHandler(async (req, res, next) => {
    res.json({
        redirectUrl: 'https://google.com'
    })
})
);

А затем на вашем клиентском интерфейсе получите ответ и сделайте перенаправление. Пример:

getUrl = async () => {
    try {
        const res = await API.get(`/go`);
        window.location = res.data.redirectUrl;
    } catch (err) {
        console.log(err);
    }
}

Работа в действии. Проверено!

В соответствии с потоком это показано как Браузер (APP) -> API (Сервер) -> Google auth (перенаправление). Это очень распространенный след с серверами поставщика удостоверений, такими как AWS, Google Auth и т. Д., Поскольку они никогда не отправляют дополнительный заголовок ALLOW ORIGIN, поэтому браузер отклоняет запрос, когда дело доходит до точки перенаправления

Теперь пришло решение для тренировок.

  1. Домен приложения (http: // localhost:3000) должен быть добавлен в качестве доверенного домена на сервере IDP.

  2. Запрос к серверу API для инициации аутентификации должен быть

    window.location.href = 'http: // localhost:5000 / api / v1 / auth / login-google';

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