2015-02-04 19 views
16

Possiedo un'applicazione per pagina singola AngularJS che utilizza un'API di backend Django basata su Django Rest Framework. L'API è protetta tramite django-rest-framework-jwt. Vorrei utilizzare django-allauth per la gestione degli account e l'autenticazione sul lato server.Django-allauth, JWT, Oauth

Mi manca solo un singolo pezzo nel flusso: in che modo il mio Oauth-Token del client viene trasferito in un token JWT? Fondamentalmente, mi piacerebbe fare come descritto qui http://blog.wizer.fr/2013/11/angularjs-facebook-with-a-django-rest-api/ basato su python-social-auth.

Quindi la mia domanda è, come si implementa la classe ObtainAuthToken dal collegamento con django-allauth?

+0

Non sono un esperto in questo argomento, ma perché è necessario creare un token basato su un altro token? Se vuoi creare un token JWT, dai un'occhiata a questa libreria: https://python-jose.readthedocs.org/en/latest/jwt/api.html – Cheng

+0

@schacki Trovi qualche soluzione su questo problema? Ho esattamente questo problema e sto cercando una buona soluzione –

risposta

0

Utilizziamo hello.js per Oauth presso la mia azienda, fornendo uno shim sul lato Python e ricevendo il token di aggiornamento/qualsiasi altro dato necessario una volta che l'utente si connette al proprio account social. Quindi li reindirizziamo tramite Django alla loro pagina dalla pagina del provider Oauth. Ogni utente ha ancora il proprio account e-mail che è necessario per jwt ma si può presumere che qualunque sia l'e-mail nell'ambito del proprio account social sia la loro e-mail quindi User.objects.create (email = "emailStringFromOauthData") ecc.

1

Di solito ci sono due flussi di accesso con accesso social: lato client ("JavaScript SDK") e lato server. Se il tuo server deve essere autorizzato, di solito è molto più facile passare attraverso il flusso sul lato server. E questo è anche quello che penso sia tutto-auth (e non hai detto che usi una libreria di frontend come il blog che hai menzionato).

Ora la sfida è fornire il token dal server al frontend. Probabilmente caricherete il token nel codice HTML dell'inizializzazione della SPA, quindi da Angular salvate il lato client del token (cookie, localStorage, ecc.) In modo che la sessione non venga persa durante un aggiornamento.

Se non si desidera che l'utente lasci la propria app, è possibile aprire l'url /accounts/login/ o /accounts/signup/ in una nuova finestra. In questa nuova finestra autorizzano la tua app e il tuo server riceve il token al tuo ritorno. Lì, dovrai generate a JWT token manually e renderlo nel modello in modo che javascript possa accedervi. Con js in quella finestra popup, puoi quindi comunicare con la tua app che ha aperto il popup e passare il token - vedi questo SO answer per un esempio - in modo che possa salvarlo.

0

Django-allauth fornisce segnali che consentono di collegarsi al processo di accesso social. Nel tuo caso, ti consiglio di iscriverti al segnale allauth.socialaccount.signals.pre_social_login. Il codice sarà simile al seguente:

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.