我正在尝试在Django中实现一个自定义身份验证后端,它将基于第三方服务(Facebook, LinkedIn等)的唯一id登录用户。基本上,一旦用户OAuth到第三方服务并获得唯一标识符,我想无缝地登录他们。
但是我的自定义后端不工作并返回' 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中调用工作没有问题——返回user。但是身份验证调用失败了——知道我做错了什么吗?
From Django docs:
一旦用户通过了身份验证,Django就会存储用户会话中用来验证用户的后端,并在会话期间重用相同的后端,无论何时需要访问当前认证的用户。这实际上意味着身份验证源是在每个会话的基础上缓存的,因此如果更改AUTHENTICATION_BACKENDS,如果需要强制用户使用不同的方法重新进行身份验证,则需要清除会话数据。一个简单的方法就是执行Session.objects.all().delete()。
试一下,我有同样的问题,这是我的修复