1

我正在尝试在 Django 中实现自定义身份验证后端,它将基于来自第三方服务(Facebook、LinkedIn 等)的唯一 ID 登录用户。基本上,一旦用户 OAuth 到第三方服务并获得唯一标识符回来,我想无缝登录。

但是我的自定义后端不起作用并返回“无”。

这是我的自定义后端:

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 中工作没有问题——返回用户。但是身份验证调用失败了 - 关于我做错了什么的任何想法?

4

1 回答 1

2

来自 Django 文档:

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

试试看,我遇到了同样的问题,这就是我的解决方法。

于 2013-01-15T10:57:13.830 回答