2012-12-23 55 views
1

我想在Django中实现一个自定义身份验证后端,它将基于来自第三方服务(Facebook,LinkedIn等)的唯一ID登录用户。基本上,一旦用户使用OAuth访问第三方服务并获得唯一标识符,我想要无缝登录它们。通过第三方应用程序的Django自定义身份验证后端

但我的自定义后端不起作用,并返回`None。'。

这里是我的自定义后端:

from myapp.models import Account 
from django.contrib.auth.models import User 

class ThirdPartyServiceBackend(object): 

    def authenticate(self,acct_id=None): 
     if acct_id is not None: 
      try: 
       return User.objects.get(account__uniq_id=acct_id) 
      except: 
       return None 

    def get_user(self, user_id): 
     try: 
      return User.objects.get(pk=user_id) 
     except User.DoesNotExist: 
      return None 

我已经启用这个后端在我的settings.py:

AUTHENTICATION_BACKENDS = (
    'myproject.myapp.backends.ThirdPartyServiceBackend', 
    'django.contrib.auth.backends.ModelBackend', 
) 

这是我如何处理它在views.py:

# oauth processing and everything goes here 
try: 
    # login and redirect to search page 

    user = authenticate(acct_id=third_party_service_user_info['id']) 

    if user is not None: 
     auth_login(request,user) 
     return HttpResponseRedirect('/') 

这调用shell中的工作没有问题 - 用户返回。但验证电话失败 - 关于我在做什么错误的任何想法?

回答

2

从Django文档:

一旦用户通过验证,使用Django的商店,其后台在用户会话的用户进行身份验证,并重新 - 只要需要访问当前经过身份验证的用户,就会在该会话期间使用相同的后端。这实际上意味着每个会话都会缓存身份验证源,因此如果您更改AUTHENTICATION_BACKENDS,则需要清除会话数据(如果需要强制用户使用不同方法重新进行身份验证)。一个简单的方法就是执行Session.objects.all()。delete()。

试试这个,我有同样的问题,那是我的修复。

相关问题