Django-allauth, JWT, Oauth
У меня есть одностраничное приложение AngularJS, которое использует API-интерфейс Django, основанный на платформе Django Rest Framework. API защищен с помощью django-rest-framework-jwt
. Я хотел бы использовать django-allauth
для управления учетными записями и аутентификации на стороне сервера.
Я просто пропускаю одну часть потока: как мой Oauth-Token от клиента передается в токен JWT? В принципе, я хотел бы сделать так, как описано здесь http://blog.wizer.fr/2013/11/angularjs-facebook-with-a-django-rest-api/ на основе python-social-auth
.
Итак, мой вопрос: как реализовать класс ObtainAuthToken из ссылки с django-allauth
?
Ответы
Ответ 1
Обычно существует два входа в систему с социальным логином: клиентская сторона ( "Javascript SDK" ) и серверная. Если ваш сервер должен быть авторизирован, обычно гораздо проще проходить поток на стороне сервера. И это также то, что я думаю обо всех auth (и вы не упомянули, что используете интерфейсную библиотеку, такую как blogpost, о которой вы говорили).
Теперь задача состоит в том, чтобы предоставить токен от сервера к интерфейсу. Вероятно, вы загрузили токен в HTML инициализации SPA, а затем из Angular сохраните сторону клиента токенов (cookie, localStorage и т.д.), Чтобы сеанс не был потерян при обновлении.
Если вы не хотите, чтобы пользователь оставил ваше приложение, вы можете открыть URL-адрес /accounts/login/
или /accounts/signup/
в новом окне. В этом новом окне они авторизуют ваше приложение, и ваш сервер получает маркер по возвращении. Там вам нужно создать маркер JWT вручную и отобразить его в шаблоне, чтобы javascript мог получить к нему доступ. С помощью js в этом всплывающем окне вы можете связаться с вашим приложением, открывшим всплывающее окно, и передать ему токен - см. Этот SO ответ для примера - так что он может сэкономить он.
Ответ 2
Мы используем hello.js для Oauth в моей компании, вы предоставляете прокладку на конце Python и получаете токен обновления/любые другие данные, необходимые, когда пользователь подключает их социальную учетную запись. Затем мы перенаправляем их через Django на свою страницу со страницы поставщика Oauth. Каждый пользователь по-прежнему имеет свою собственную учетную запись электронной почты, которая необходима для jwt, но вы можете предположить, что любой адрес электронной почты находится в сфере их социальной учетной записи, это их адрес электронной почты, затем User.objects.create(email = "emailStringFromOauthData" ) и т.д.
Ответ 3
Django-allauth предоставляет сигналы, которые позволяют подключиться к процессу социального входа. В вашем случае я бы рекомендовал подписаться на сигнал allauth.socialaccount.signals.pre_social_login. Код будет выглядеть примерно так:
from allauth.socialaccount.signals import pre_social_login
@receiver(pre_social_login)
def create_jwt_token(sender, request, sociallogin, **kwargs):
# dig into the sociallogin object to find the new access token.