@mcakaneo
Я люблю пиццу

Как правильно организовать аутентификацию(oauth2) через социальные сети на стороне rest api сервера?

Допустим есть фронтенд(SPA) на JavaScript (clientapp.com) и backend rest api на PHP (mybackend.com). Только бэкенд знает client_secret из приложения в Facebook.
Допустим пользователь нажимает на кнопку "Войти через Facebook" после чего происходит запрос:
https://www.facebook.com/v6.0/dialog/oauth?
    client_id=123456&
    redirect_uri=http://mybackend/fblogin&
    display=page&
    scope=public_profile,email&
    response_type=code

Если пользователь не вошел в Facebook, то выводится страница входа в Facebook. Также, если пользователь уже залогинился в фейсбуке, но еще не давал разрешения приложению, то ему будет предложено сделать это или отказаться.
Если пользователь и вошёл и всё разрешил, то далее facebook делает перенаправление на redirect_uri с authorization code, то есть на бэкенд(далее всё происходит на бэкенде):
http://mybackend/fblogin?code=2612648688
Этот код будет использоваться на бэкенде вместе с client_secret, чтобы получить access_token(происходит обмен code на access_token). Вот на такой адрес будет отправлен запрос(через curl), чтобы был возвращён access_token:
https://graph.facebook.com/oauth/access_token?
    client_id=123456&
    redirect_uri=http://mybackend/fblogin&
    client_secret=347563478563478&
    code=2612648688

access_token позволит получить доступ к данным пользователя с помощью которых можно будет зарегестрировать или аутентифицировать пользователя. Вот так получаем данные пользователя(тоже через curl):
https://graph.facebook.com/v6.0/me?
    access_token=2384H2G384GK743423&
    fields=public_profile,email,location,...

После того как было выполнено всё это, нужно отправить jwt токен клиенту и сохранить его в локальном хранилище.
Так вот, как отправить jwt токен? Как сделать так, чтобы после этого всего пользователь оказался на своей странице, например, clientapp.com/id_765? И чтобы при этом фронтенд получил jwt токен(из заголовка Authorization). Я даже не представляю как на frontend получить ответ с заголовками из backend без прямого запроса(ajax) из фронтенда на бэкенд. А здесь такого запроса нет, frontend делает запрос на Facebook, а не на backend.
Во всех руководствах умалчивается это, либо я туплю, что более вероятно.
  • Вопрос задан
  • 285 просмотров
Решения вопроса 1
john36allTa
@john36allTa
alien glow of a dirty mind
Решение: просто ответить на запрос со фронта, т.к. он был фэйсбуком редиректнут
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы