2013-05-05 5 views
7

Ich habe eine mobile App, mit der Benutzer sich über Facebook anmelden können. Sobald ich das Zugriffstoken von der FB erhalten habe, sende ich es an das Django-Backend.Wie erstellt man einen neuen Benutzer und ein neues django allauth soziales Konto, wenn ein Zugriffstoken über API gegeben wird?

Aber was dann?

Gibt es innerhalb von django-allauth eine Methode, mit der ich das Zugriffstoken füttern kann, damit es den neuen Benutzer/sozialen Account erstellt?

Oder muss ich alles manuell machen?

Antwort

6

Ich finde immer die Antworten direkt nach dem Stellen der Frage. In jedem Fall ist das folgende eine benutzerdefinierte Methode für UserResource (tastypie api mit ApiKeyAuthentication). Das meiste davon stammt aus der Methode login_by_token in allauth.socialaccount.providers.facebook.views.

Ich werde meine Antwort für eine Weile nicht korrekt auswählen, falls jemand eine bessere Antwort schreibt.

def facebook_login(self, request, **kwargs): 
    self.method_check(request, allowed=['post']) 

    data = self.deserialize(request, request.raw_post_data, format=request.META.get('CONTENT_TYPE', 'application/json')) 

    access_token = data.get('access_token', '') 

    from allauth.socialaccount import providers 
    from allauth.socialaccount.models import SocialLogin, SocialToken, SocialApp 
    from allauth.socialaccount.providers.facebook.views import fb_complete_login 
    from allauth.socialaccount.helpers import complete_social_login 
    try: 
     app = SocialApp.objects.get(provider="facebook") 
     token = SocialToken(app=app, 
          token=access_token) 
     login = fb_complete_login(app, token) 
     login.token = token 
     login.state = SocialLogin.state_from_request(request) 
     ret = complete_social_login(request, login) 

     #if we get here we've succeeded 
     return self.create_response(request, { 
       'success': True, 
       'username': request.user.username, 
       'user_id': request.user.pk, 
       'api_key': request.user.api_key.key, 
       }) 
    except: 
     # FIXME: Catch only what is needed 
     return self.create_response(request, { 
       'success': False, 
       'reason': "Bad Access Token", 
       }, HttpForbidden) 
+0

Ich verbrachte Stunden über den allauth Code rätselhaft , und kam schließlich mit etwas ziemlich ähnlich zu diesem ... aber nur das gerade jetzt gefunden. Vielen Dank! – Kobold

+0

Wie nennt man diesen Code? – diofeher

+1

mit den neuen Versionen seine jetzt 'fb_complete_login (Anfrage, App, Token)' – psychok7

1

Arbeits Source Code: In der Klasse UserResource (modelresource):

def override_urls(self): 
    return [ 
     url(r"^(?P<resource_name>%s)/facebook_login%s$" % 
      (self._meta.resource_name, trailing_slash()), 
      self.wrap_view('facebook_login'), name="api_facebook_login"), 
    ] 

def facebook_login(self, request, **kwargs): 
    self.method_check(request, allowed=['post']) 

    data = self.deserialize(
     request, 
     request.raw_post_data, 
     format=request.META.get('CONTENT_TYPE', 'applicaton/json')) 

    access_token = data.get('access_token', '') 

    print(access_token) 

    from allauth.socialaccount import providers 
    from allauth.socialaccount.models import SocialLogin, SocialToken, SocialApp 
    from allauth.socialaccount.providers.facebook.views import fb_complete_login 
    from allauth.socialaccount.helpers import complete_social_login 
    try: 
     app = SocialApp.objects.get(provider="facebook") 
     print(app) 
     token = SocialToken(app=app, 
          token=access_token) 
     login = fb_complete_login(app, token) 
     login.token = token 

     login.state = SocialLogin.state_from_request(request) 
     ret = complete_social_login(request, login) 

     #if we get here we've succeeded 
     return self.create_response(request, { 
       'success': True, 
       'username': request.user.username, 
       'user_id': request.user.pk, 
       'api_key': request.user.api_key.key, 
       }) 
    except: 
     # FIXME: Catch only what is needed 
     return self.create_response(request, { 
       'success': False, 
       'reason': "Bad Access Token", 
       }, HttpForbidden) 

Dann:

curl --dump-header - -H „Content-Type: application/json "-X POST --Daten '{" access_token ":" xxxxxxxx "}' http://xx.xxxxxx.com:8000/api/v1/user/facebook_login/

Test OK, Benutzer erstellen OK.

Vielen Dank.

+0

Was fehlt mir? Das sieht genau so aus, wie ich es gepostet habe. In jedem Fall habe ich festgestellt, dass es eine sehr schlechte Lösung ist, da es eine Menge von Szenarien hat, in denen es bricht, wie wenn ein Benutzer bereits in Ihrer Datenbank mit derselben E-Mail wie ihre Facebook-E-Mail existiert. – KrisF

+0

@KrisF können Sie die Antwort, die diese Senarios abdeckt, veröffentlichen? – rajat

+0

@rajat Tut mir leid, wir haben es nie herausgefunden, bevor wir zu etwas ganz anderem übergegangen sind. – KrisF

Verwandte Themen