2015-02-04 12 views
16

Ich habe eine AngularJS Single Page Anwendung, die eine Django Backend API auf der Basis des Django Rest Framework verwendet. Die API ist über django-rest-framework-jwt geschützt. Ich möchte django-allauth für Kontoverwaltung und Authentifizierung auf der Serverseite verwenden.Django-Allauth, JWT, OAuth

mir fehlt gerade ein Stück im Flow: Wie wird mein Oauth-Token vom Client in ein JWT-Token übertragen? Grundsätzlich möchte ich wie hier beschrieben http://blog.wizer.fr/2013/11/angularjs-facebook-with-a-django-rest-api/ basierend auf python-social-auth machen.

Also meine Frage ist, wie implementiere ich die ObtainAuthToken-Klasse von der Verbindung mit django-allauth?

+0

Ich bin kein Experte zu diesem Thema, aber warum müssen Sie ein Token basierend auf einem anderen Token erstellen? Wenn Sie ein JWT-Token erstellen möchten, werfen Sie einen Blick auf diese Bibliothek: https://python-jose.readthedocs.org/en/latest/jwt/api.html – Cheng

+0

@schacki Finden Sie eine Lösung für dieses Problem? Ich habe genau dieses Problem und suche nach einer guten Lösung –

Antwort

0

Wir verwenden hello.js für Oauth bei meiner Firma, die Sie eine Shim auf dem Python-Ende bereitstellen und das Aktualisierungstoken erhalten/was auch immer andere Daten benötigt, sobald der Benutzer ihr soziales Konto verbindet. Wir leiten sie dann über Django von der Seite ihres Oauth-Anbieters auf ihre Seite um. Jeder Benutzer hat immer noch ihr eigenes E-Mail-Konto, das für jwt benötigt wird, aber man konnte davon ausgehen, dass alles, was E-Mails im Rahmen ihres sozialen Kontos ist die E-Mail dann User.objects.create (email = „emailStringFromOauthData“) usw.

1

In der Regel gibt es zwei Login-Flows mit einem sozialen Login: clientseitig ("Javascript SDK") und serverseitig. Wenn Ihr Server autorisiert werden muss, ist es normalerweise viel einfacher, den serverseitigen Fluss zu durchlaufen. Und genau das denke ich auch an All-Auth (und Sie haben nicht erwähnt, dass Sie eine Frontend-Bibliothek wie den von Ihnen erwähnten Blogpost verwenden).

Jetzt besteht die Herausforderung darin, das Token vom Server zum Frontend zu stellen. Sie würden wahrscheinlich das Token im HTML der Initialisierung des SPA laden und dann von Angular die Token-Client-Seite (Cookie, localStorage, etc.) speichern, damit die Sitzung bei einer Aktualisierung nicht verloren geht. Wenn Sie nicht möchten, dass der Benutzer Ihre App verlässt, können Sie Ihre /accounts/login/ oder /accounts/signup/ URL in einem neuen Fenster öffnen. In diesem neuen Fenster autorisieren sie Ihre App und Ihr Server erhält das Token bei der Rückkehr. Dort müssen Sie generate a JWT token manually haben und das in die Vorlage rendern, damit JavaScript darauf zugreifen kann. Mit js in diesem Popup-Fenster können Sie dann mit Ihrer App kommunizieren, die das Popup geöffnet hat und ihm das Token übergeben - siehe hierzu SO answer - um es zu speichern.

0

Django-allauth liefert Signale, mit denen Sie sich in den sozialen Login-Prozess einklinken können. In Ihrem Fall würde ich empfehlen, das allauth.socialaccount.signals.pre_social_login-Signal zu abonnieren. Der Code sieht ungefähr so ​​aus:

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.