Я пытаюсь реализовать сервер OAuth2 для RESTfull API с возможностью входа через социальные платформы (Github, Facebook, Instagram) с использованием веб-фреймворков Python и Falcon.Но я изо всех сил пытался понять, как эта штука должна работать.
Мое нынешнее понимание привело меня к следующей схеме:
1.1.На стороне API я создаю конечную точку /auth/login/github
, которая в основном скажет мобильному приложению перенаправить клиента на страницу авторизации Github.com - github.com/login/oauth/authorize
1.2.На странице авторизации Github пользователю будет представлен следующий экран: 1.3.После нажатия Авторизировать пользователь перейдет на страницу, указанную в параметре callback
(конфигурация службы Github OAuth) с вновь предоставленным временным кодом авторизации.В моем случае URL будет выглядеть так: my.api.com/auth/callback/github?code=AUTH_CODE
2.1.После получения запроса на обратный вызов я анализирую / извлекаю переданный код авторизации и запрашиваю Github.com из бэкэнда, чтобы выкупить код авторизации и получить токен доступа (отправка запроса POST с использованием моего идентификатора клиента и Client Secret на github.com/login/oauth/access_token
) 2.2.Если все прошло успешно, Github ответит на мой запрос POST с токеном доступа , который я могу использовать для получения данных профиля пользователя (например, по электронной почте)
3.1.Теперь, когда я знаю, что авторизация через Github прошла успешно (потому что я получил электронную почту пользователей), я могу предоставить свой собственный токен доступа этому пользователю, чтобы он мог запрашивать мои конечные точки API.Я делаю это, просто добавляя случайным образом генерируемый OAuth2 Token и вставляя его в мою базу данных, одновременно возвращая тот же токен пользователю, перенаправляя его в мобильное приложение с использованием глубоких ссылок (например, myapp: // token).3.2.Наконец, мобильное приложение может запрашивать мои конечные точки API, добавляя следующий заголовок к каждому запросу Authorization: Bearer 0b79bab50daca910b000d4f1a2b675d604257e42
Имеет ли это смысл и является ли это правильным способом социальной авторизации для API RESTfull?
Я использую Falcon в качестве веб-фреймворка для этого проекта и Authlib в качестве библиотеки OAuth2.