2015-02-04 14 views
16

Mam aplikację AngularJS Single Page, która korzysta z interfejsu API Django opartego na strukturze Django Rest Framework. Interfejs API jest chroniony przez django-rest-framework-jwt. Chciałbym użyć django-allauth do zarządzania kontem i uwierzytelniania po stronie serwera.Django-allauth, JWT, Oauth

Po prostu brakuje mi jednego elementu w przepływie: Jak mój Oauth-Token od klienta zostaje przeniesiony do tokenu JWT? Zasadniczo chciałbym zrobić jak opisano tutaj http://blog.wizer.fr/2013/11/angularjs-facebook-with-a-django-rest-api/ na podstawie python-social-auth.

Moje pytanie brzmi: jak zaimplementować klasę ObtainAuthToken z linku z django-allauth?

+0

Nie jestem ekspertem w tym temacie, ale dlaczego trzeba utworzyć token na podstawie innego tokena? Jeśli chcesz utworzyć token JWT, przejrzyj tę bibliotekę: https://python-jose.readthedocs.org/en/latest/jwt/api.html – Cheng

+0

@schacki Czy znalazłeś jakieś rozwiązanie dotyczące tego problemu? Mam dokładnie ten problem i szukam dobrego rozwiązania –

Odpowiedz

0

Używamy hello.js dla Oautha w mojej firmie, dajesz podkładkę na końcu Pythona i otrzymujesz odświeżający token/jakiekolwiek inne dane potrzebne, gdy użytkownik połączy swoje konto społecznościowe. Następnie przekierowujemy je przez Django na ich stronę ze strony dostawcy Oauth. Każdy użytkownik nadal ma własne konto e-mail, które jest potrzebne dla jwt, ale możesz założyć, że jakakolwiek wiadomość e-mail jest w zasięgu konta społecznościowego, to ich e-mail, a następnie User.objects.create (email = "emailStringFromOauthData") itp.

1

Zwykle są dwa strumienie logowania z loginem społecznościowym: po stronie klienta ("Javascript SDK") i po stronie serwera. Jeśli Twój serwer wymaga autoryzacji, zwykle łatwiej jest przejść przez proces po stronie serwera. I to też jest to, co myślę, że wszystko-auth (i nie wspomniałeś, że używasz biblioteki frontend, tak jak wspomniany blog blog).

Teraz wyzwaniem jest dostarczenie tokena z serwera do interfejsu. Prawdopodobnie załadowałbyś token w kodzie HTML inicjalizacji SPA, a następnie z Angular zapiszesz stronę klienta tokena (cookie, localStorage itp.), Aby sesja nie została utracona podczas odświeżania.

Jeśli nie chcesz, aby użytkownik opuścił Twoją aplikację, możesz otworzyć swój adres URL: /accounts/login/ lub /accounts/signup/ w nowym oknie. W tym nowym oknie autoryzują twoją aplikację, a twój serwer otrzymuje token po powrocie. Tam będziesz musiał generate a JWT token manually i renderować go do szablonu, aby javascript mógł uzyskać do niego dostęp. Za pomocą js w tym oknie możesz komunikować się z aplikacją, która otworzyła wyskakujące okienko i przekazać token - zobacz na przykład ten SO answer - aby go zapisać.

0

Django-allauth dostarcza sygnałów, które umożliwiają podpięcie się do procesu logowania w serwisie społecznościowym. W twoim przypadku polecam subskrybowanie sygnału allauth.socialaccount.signals.pre_social_login. Kod będzie wyglądał mniej więcej tak:

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. 
Powiązane problemy