Django通过第三方应用自定义认证后端



我正在尝试在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()。

试一下,我有同样的问题,这是我的修复

最新更新