with restful framework expiration docs authentication_classes allauth django django-allauth jwt

restful - Django-allauth, JWT, Oauth



django restful (3)

Tengo una aplicación de página única AngularJS que utiliza una API de back-end de Django basada en el marco de descanso de Django. La API está protegida a través de django-rest-framework-jwt . Me gustaría usar django-allauth para la administración y autenticación de cuentas en el lado del servidor.

Solo me falta una pieza en el flujo: ¿Cómo se transfiere mi Oauth-Token del cliente a un JWT-token? Básicamente, me gustaría hacer lo que se describe aquí http://blog.wizer.fr/2013/11/angularjs-facebook-with-a-django-rest-api/ basado en python-social-auth .

Entonces, mi pregunta es, ¿cómo implemento la clase ObtainAuthToken desde el enlace con django-allauth ?


Django-allauth proporciona señales que le permiten conectarse al proceso de inicio de sesión social. En su caso, recomendaría suscribirse a la señal allauth.socialaccount.signals.pre_social_login. El código se verá algo así:

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.


Normalmente hay dos flujos de inicio de sesión con inicio de sesión social: del lado del cliente ("Javascript SDK") y del lado del servidor. Si su servidor necesita autorización, generalmente es mucho más fácil pasar por el flujo del lado del servidor. Y eso es también lo que creo que todo-auth (y no mencionaste que usas una biblioteca de interfaz como lo hace el blogpost que mencionaste).

Ahora el desafío es proporcionar el token del servidor a la interfaz. Probablemente cargaría el token en el HTML de la inicialización del SPA, y luego desde Angular guardaría el lado del cliente del token (cookie, localStorage, etc.) para que la sesión no se pierda en una actualización.

Si no desea que el usuario abandone su aplicación, puede abrir su /accounts/login/ o /accounts/signup/ url en una nueva ventana. En esa nueva ventana, ellos autorizan su aplicación y su servidor recibe el token al regresar. Allí, tendrá que generar un token JWT manualmente y representarlo en la plantilla para que javascript pueda acceder a él. Con js en esa ventana emergente, puede comunicarse con su aplicación que abrió la ventana emergente y pasarle el token (ver esta respuesta de SO para obtener un ejemplo) para que pueda guardarlo.


Usamos hello.js para Oauth en mi compañía, usted proporciona un calce en el extremo de Python y obtiene el token de actualización / cualquier otro dato que sea necesario una vez que el usuario se conecta a su cuenta social. Luego los redireccionamos a través de Django a su página desde la página de su proveedor de Oauth. Cada usuario aún tiene su propia cuenta de correo electrónico que es necesaria para jwt, pero puede asumir que cualquier correo electrónico que se encuentre dentro del alcance de su cuenta social es su correo electrónico, luego User.objects.create (email = "emailStringFromOauthData") etc.