Ich benutze das Facebook iOS SDK um den Facebook Access Token an meinen Django Server URI zu senden. Die entsprechende Funktion views.py wird unten gezeigt und ich bekomme einen 200 Response Code, wenn ich den POST von iOS mache. Allerdings habe ich einen zweiten @login_required dekorierten URI, den ich vom iOS-Gerät unmittelbar nach dem Anruf anrufe, der mich nicht eingeloggt betrachtet und mich auf meine Hauptseite weiterleitet. Was mache ich falsch? Wie bleibe ich nach meinem POST von iOS angemeldet?django-allauth einloggen mit Facebook Token von iOS Gerät
# For POSTing the facebook token
from django.views.decorators.csrf import csrf_exempt
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
# Log in from Facebook
@csrf_exempt
def mobile_facebook_login(request):
response = HttpResponse() ## Create an HTTP Response Object
if request.method == "POST": # The method better be a POST
access_token = request.POST.get('access_token') # Get token
try:
app = SocialApp.objects.get(provider="facebook")
token = SocialToken(app=app, token=access_token)
# Check token against facebook
login = fb_complete_login(request, app, token)
login.token = token
login.state = SocialLogin.state_from_request(request)
# Add or update the user into users table
ret = complete_social_login(request, login)
# If we get here we've succeeded
response['Auth-Response'] = 'success'
response.status_code = 200 # Set status
return response
except Exception,e:
# If we get here we've failed
response['Auth-Response'] = 'failure: %s'%(e)
response.status_code = 401 # Set status
return response
else:
# If we get here we've failed
response['Auth-Response'] = 'failure'
response.status_code = 401 # Set status
return response
======= ========== UPDATE
Ok, danke für die Kommentare. So poste ich jetzt auch die Facebook-E-Mail-Adresse und erhalte den Benutzer und logge sie manuell ein. Nachfolgende Anforderungen STILL werden jedoch nicht authentifiziert. Also der @login_required Decorator schlägt immer noch fehl .. Irgendwelche anderen Ideen?
# Log in from Facebook
@csrf_exempt
def mobile_facebook_login(request):
response = HttpResponse() ## Create an HTTP Response Object
if request.method == "POST": # The method better be a POST
access_token = request.POST.get('access_token') # Get token
email = request.POST.get('email') # Get email
try:
app = SocialApp.objects.get(provider="facebook")
token = SocialToken(app=app, token=access_token)
# Check token against facebook
login = fb_complete_login(request, app, token)
login.token = token
login.state = SocialLogin.state_from_request(request)
# Add or update the user into users table
ret = complete_social_login(request, login)
# Try to get username from email
try:
user = User.objects.get(email=email) # Get User
# Login the user from Django's perspective
user.backend = 'django.contrib.auth.backends.ModelBackend'
auth_login(request,user)
except User.DoesNotExist:
# If we get here we've failed
response['Auth-Response'] = 'failure: %s'%(e)
response.status_code = 401 # Set status
return response
# If we get here we've succeeded
response['Auth-Response'] = 'success'
response.status_code = 200 # Set status
return response
except Exception,e:
# If we get here we've failed
response['Auth-Response'] = 'failure: %s'%(e)
response.status_code = 401 # Set status
return response
else:
# If we get here we've failed
response['Auth-Response'] = 'failure'
response.status_code = 401 # Set status
return response
==== Ein weiteres Update ==========
Basierend auf der zweite Antwort in diesem Beitrag: django authentication without a password
ich einen benutzerdefinierten Login-Backend erstellt, das tut kein Passwort erforderlich. Die dritte Antwort in diesem Beitrag erläutert, wie dies geschieht:
speichert nicht die Anmeldebestätigung in der Sitzung. Also habe ich versucht, ein benutzerdefiniertes Backend zu verwenden.
Hier ist meine modifizierte Code:
# Log in from Facebook
@csrf_exempt
def mobile_facebook_login(request):
response = HttpResponse() ## Create an HTTP Response Object
if request.method == "POST": # The method better be a POST
access_token = request.POST.get('access_token') # Get token
email = request.POST.get('email') # Get email
try:
app = SocialApp.objects.get(provider="facebook")
token = SocialToken(app=app, token=access_token)
# Check token against facebook
login = fb_complete_login(request, app, token)
login.token = token
login.state = SocialLogin.state_from_request(request)
# Add or update the user into users table
ret = complete_social_login(request, login)
# Try to get username from email
try:
user = User.objects.get(email=email) # Get User
# Login the user from Django's perspective
user.backend = 'django_tours.auth_backend.PasswordlessAuthBackend'
user = authenticate(email=user.email)
auth_login(request,user)
#request.session.cycle_key()
except User.DoesNotExist:
# If we get here we've failed
response['Auth-Response'] = 'failure: %s'%(e)
response.status_code = 401 # Set status
return response
# If we get here we've succeeded
response['Auth-Response'] = 'success'
response['User-Is-Authenticated'] = '%s'%(request.user.is_authenticated())
response.status_code = 200 # Set status
return response
except Exception,e:
# If we get here we've failed
response['Auth-Response'] = 'failure: %s'%(e)
response.status_code = 401 # Set status
return response
else:
# If we get here we've failed
response['Auth-Response'] = 'failure'
response.status_code = 401 # Set status
return response
Mit hurl.it ich diesen HTTP 200 Antwort erhalten, aber ich bin immer noch nicht vom iPhone angemeldet als:
Auth-Response: success
Content-Encoding: gzip
Content-Length: 20
Content-Type: text/html; charset=utf-8
Date: Thu, 08 May 2014 00:22:47 GMT
Server: Apache/2.2.22 (Ubuntu)
Set-Cookie: csrftoken=UuJDP6OB3YCSDtXLEa10MgJ70tDtIfZX; expires=Thu, 07-May-2015 00:22:48 GMT; Max-Age=31449600; Path=/, sessionid=kdr061v1pcsbqtvgsn3pyyqj9237z6k8; expires=Thu, 22-May-2014 00:22:48 GMT; httponly; Max-Age=1209600; Path=/, messages="4f919699a4730a3df220a0eb3799ed59d2756825$[[\"__json_message\"\0540\05425\054\"Successfully signed in as philbot.\"]]"; Path=/
User-Is-Authenticated: True
Vary: Cookie,Accept-Encoding
Haben Sie versucht, es im Browser zu tun? Tritt das Problem erneut auf, wenn Sie URLs vom Browser aus aufrufen? Sind Cookies im iOS SDK aktiviert? –
Ich glaube nicht, dass Sie @login_required verwenden können. Das nächste Mal, wenn Sie eine Django-Ansicht aufrufen, weiß django nicht, wer der Benutzer ist, da der SDK die Cookie-Informationen nicht weitergibt. Eine Lösung besteht darin, das Token für jeden Aufruf an die Sicht weiterzuleiten und den Benutzer mit einem Benutzernamen anzumelden Custom Decorator.Bitte beachten Sie, dass es nicht der beste Weg nach vorne ist. –
Ich habe nicht viel Information über 'allauth'. Ich weiß jedoch, dass Django 'login_required' etwas wie 'if request.user.is_authorized() == True' tun wird. Ich sehe nichts ändert den Benutzer Autorisierungsstatus, es sei denn allauth tut es für Sie. Also was ich vorschlage ist, den Status deines 'django.auth' Benutzers zu ändern und is_authorized = True zu machen. Stellen Sie sicher, dass die 'Sitzung' erstellt wurde. Wenn der Benutzer in eine andere Ansicht wechselt, kann Django den Status der Benutzerauthentifizierung überprüfen. Lassen Sie uns wissen, was nach diesem Prozess angezeigt wird, damit wir Ihnen helfen können. – Othman