[英]Django custom authentication backend via third-party app
我正在尝试在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('/')
这样在外壳中调用工作就没问题-用户已返回。 但是验证电话失败了-关于我在做什么的任何想法吗?
从Django文档中:
用户通过身份验证后,Django会在用户会话中存储用于验证用户身份的后端,并在需要访问当前身份验证的用户时在该会话期间重复使用相同的后端。 这实际上意味着身份验证源将基于每个会话进行缓存,因此,如果更改AUTHENTICATION_BACKENDS,则需要强制用户使用其他方法重新进行身份验证,则需要清除会话数据。 一个简单的方法就是执行Session.objects.all()。delete()。
试试看,我有同样的问题,那是我的解决办法。
Django可以实现第三方Auth方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.