2013-07-25 9 views
26

Ich verwende django-allauth auf meiner Website für soziale Logins. Ich habe auch eine REST-API mit django-rest-framework, die als Backend einer mobilen App dient. Gibt es eine Möglichkeit, das Authentifizierungs-Backend von allauth direkt mit der REST API zu verbinden, so dass ich Benutzer, die den Facebook-Login in der mobilen App verwenden, validieren (und registrieren) kann?Schließen Sie django-allauth als Endpunkt in django-rest-framework an.

Zur Klarstellung: Der Facebook Login Teil wird von nativen SDKs behandelt. Ich brauche einen Endpunkt, der funktioniert wie POST /user (das heißt, erstellt einen neuen Benutzer), aber nimmt Facebook oauth Token als Eingabe anstelle von E-Mail/Passwort usw.

+0

mögliches Duplikat der [oauth2-Token-Authentifizierung mit django-oauth-toolkit und python-social-auth] (http://stackoverflow.com/questions/27051209/oauth2-token-authentication-using-django-oauth-toolkit- und-python-social-auth) –

Antwort

2

Während ich bin mir nicht ganz sicher, wie Allauth und Ruhe- fremework zusammen, allauth does not offer such an endpoint.

Vorschlag: Ihre Selbst machen, die eine Variation der folgenden tut:
Anruf allauth.socialaccount.providers.facebook.views.fb_complete_login (None, socialtoken), wo socialtoken wie in login_by_token erstellt ist. Dies führt (einige Funktionen tiefer) zu einem django.contrib.auth.login, wodurch möglicherweise das acct erstellt wird.

Danach ist für den Einsatz auf mobilen Geräten, könnte es möglich sein, auf die die Auth (nicht FB) token: die Benutzerdaten erhalten, und rufen rest_framework.authtoken.views.obtain_auth_token

(von Sitzung?) Hinweise:
1. Dies bietet keine Möglichkeit, E-Mail-Konflikte zu lösen oder soziale/lokale Verbindungen zu verbinden.
2. Ich habe es nicht versucht - bitte schreiben Sie Code, wenn Sie es zum Laufen bringen können.

9

Sie können diese libray für soziale Authentifizierung django-rest-framework-social-oauth2 verwenden. Versuchen Sie, diese django-allauth bezogenen Code

urls.py

urlpatterns = [ 
    url(
     r'^rest/facebook-login/$', 
     csrf_exempt(RestFacebookLogin.as_view()), 
     name='rest-facebook-login' 
    ), 
] 

serializers.py

class EverybodyCanAuthentication(SessionAuthentication): 
    def authenticate(self, request): 
     return None 

views.py

class RestFacebookLogin(APIView): 
    """ 
    Login or register a user based on an authentication token coming 
    from Facebook. 
    Returns user data including session id. 
    """ 

    # this is a public api!!! 
    permission_classes = (AllowAny,) 
    authentication_classes = (EverybodyCanAuthentication,) 

    def dispatch(self, *args, **kwargs): 
     return super(RestFacebookLogin, self).dispatch(*args, **kwargs) 

    def get(self, request, *args, **kwargs): 
     try: 
      original_request = request._request 
      auth_token = request.GET.get('auth_token', '') 

      # Find the token matching the passed Auth token 
      app = SocialApp.objects.get(provider='facebook') 
      fb_auth_token = SocialToken(app=app, token=auth_token) 

      # check token against facebook 
      login = fb_complete_login(original_request, app, fb_auth_token) 
      login.token = fb_auth_token 
      login.state = SocialLogin.state_from_request(original_request) 

      # add or update the user into users table 
      complete_social_login(original_request, login) 
      # Create or fetch the session id for this user 
      token, _ = Token.objects.get_or_create(user=original_request.user) 
      # if we get here we've succeeded 
      data = { 
       'username': original_request.user.username, 
       'objectId': original_request.user.pk, 
       'firstName': original_request.user.first_name, 
       'lastName': original_request.user.last_name, 
       'sessionToken': token.key, 
       'email': original_request.user.email, 
      } 
      return Response(
       status=200, 
       data=data 
      ) 

     except: 
      return Response(status=401, data={ 
       'detail': 'Bad Access Token', 
      }) 
0

Sie Django Rest Auth dafür verwenden können, hängt davon ab, welche Django-Allauth. Es ist sehr einfach zu integrieren.