Попытка перенаправить клиента в 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, поэтому браузер отклоняет запрос, когда дело доходит до точки перенаправления
Теперь пришло решение для тренировок.
Домен приложения (http: // localhost:3000) должен быть добавлен в качестве доверенного домена на сервере IDP.
Запрос к серверу API для инициации аутентификации должен быть
window.location.href = 'http: // localhost:5000 / api / v1 / auth / login-google';