Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Как вернуть коллбек OpenID (NodeJS + Angular) (https://javascript.ru/forum/angular/74731-kak-vernut-kollbek-openid-nodejs-angular.html)

olimpset 04.08.2018 00:22

Как вернуть коллбек OpenID (NodeJS + Angular)
 
На бэкенде (node) реализована авторизация с помощью passport (passport-steam). Как из фронтенд (angular) вызвать страницу авторизации, но так чтобы бы можно было получить ответ. Если делать обычным способом $http.get('/auth/steam), то ошибка, так как Стим должен открываться во вкладке браузера. Но если сделать так: window.location.url = auth/steam, то страница авторизации (Стима) открывается. Но как вернуть результат, что авторизация прошла успешно, когда по GET передаются токены (ответ) обратно сайту, ведь сайт как бы закрывается и связь прерывается, когда во вкладке открывается другой сайт?

Изначальная проблема в том, что нужно отследить что авторизация прошла и res.redirect('/'), но естественно, он не сработает, так как только в фронтенд можно делать переадресацию. Думал это сделать с помощью socket.io на клиенте функция onAuth() и она вызывается, когда пришел ответ OpenID, и уже делает редирект куда нужно. Но это костыль, как мне кажется. Не держать же постоянно конект, только для этого. Помогите, уже неделю с этим мучаюсь, что только не гуглил уже.

destus 04.08.2018 07:30

olimpset,
window.location.url = auth/steam. Далее нода редиректит на steam OpenID. После успешной авторизации будет редирект от steam на указанный мной URL (пусть /auth/steam/return). В req.user хранится пользователь, данные о котором я могу передать на URL res.redirect('/.../#/authcallback)`, который будет обрабатываться Ангуляром. Токен в queryParams например передавать.
То есть схематично: Ангуляр редирект на ноду => нода на steam => steam на ноду => нода на URL, который обрабатываться будет ангуляром.

olimpset 04.08.2018 14:34

Цитата:

Сообщение от destus (Сообщение 491720)
olimpset,
window.location.url = auth/steam. Далее нода редиректит на steam OpenID. После успешной авторизации будет редирект от steam на указанный мной URL (пусть /auth/steam/return). В req.user хранится пользователь, данные о котором я могу передать на URL res.redirect('/.../#/authcallback)`, который будет обрабатываться Ангуляром. Токен в queryParams например передавать.
То есть схематично: Ангуляр редирект на ноду => нода на steam => steam на ноду => нода на URL, который обрабатываться будет ангуляром.

Так и делал, но после того как произойдет return (придет ответ OpenID), res.redirect тупо не срабатывает. Никуда редиректить не хочет. Подозреваю, это angular блочит, так как он разделяет свои роуты (с хэштегом) от роутов backend и их не вызывает. Не знаю как быть. А res.redirect('/#') не работает еще, потому что с сервера нельзя послать хэштег в url в фронтенд. Есть еще какие то варианты?

destus 04.08.2018 14:47

olimpset,
Не надо никаких других вариантов. Это и есть правильный и работающий вариант. Естественно когда вы делаете редирект на URL .../authcallback, сперва этот запрос обрабатывается нодой. А нода должна послать ваш index.html (точка входа в проект) res.sendFile('path/to/index.html'). Далее уже этот URL будет обрабатываться ангуляровским роутером. И можно не использовать хэштэг, а обычный HTML5 History API (PathLocationStrategy) https://angular.io/guide/router#appe...ser-url-styles

olimpset 04.08.2018 15:15

Цитата:

Сообщение от destus (Сообщение 491748)
olimpset,
Не надо никаких других вариантов. Это и есть правильный и работающий вариант. Естественно когда вы делаете редирект на URL .../authcallback, сперва этот запрос обрабатывается нодой. А нода должна послать ваш index.html (точка входа в проект) res.sendFile('path/to/index.html'). Далее уже этот URL будет обрабатываться ангуляровским роутером. И можно не использовать хэштэг, а обычный HTML5 History API (PathLocationStrategy) https://angular.io/guide/router#appe...ser-url-styles

Спасибо большое, получилось. Нода в роуте return передает res.redirect('/#!/authcallback', {status: true/false}); И Angular уже сам редиректит куда нужно, смотря какой status.


Часовой пояс GMT +3, время: 16:59.