在我的django应用程序中,我按照docs中的示例编写了一个自定义身份验证后端,似乎工作正常。 (我通过电子邮件向用户发送包含签名令牌的登录URL;下面的视图处理这些令牌登录URL。)我可以从日志消息中确认request.user正确设置。
但是,由@login_required
装饰器保护的配置文件视图会重定向到登录页面,就好像用户没有登录一样。看起来login
的调用无法正常工作。我忽略了什么吗?我不确定如何进一步调试。 (因为这是我的第一个django应用程序,我决定编写自己的登录视图,这样工作正常......)谢谢!
来自views.py:
def token_login(request, token):
user = authenticate(token=token)
if user:
log.info("LOGGING IN {}".format(user))
login(request, user)
log.info(request.user)
return redirect('myapp:profile')
else:
return render(request, 'myapp/error.html', {
'title': 'Invalid Token',
'message': 'Sorry, this is not a valid login token.'
})
自定义身份验证后端:
class TokenBackend:
"""
Authenticates against a signed token; creates a new user if none existed before.
"""
def get_user(self, username):
try:
User.objects.get(pk=username)
except User.DoesNotExist:
return None
def authenticate(self, token):
log.info("AUTHENTICATING WITH TOKENBACKEND")
try:
token_contents = signing.loads(token, salt=settings.SALT,
max_age=settings.PASSWORD_TOKEN_MAX_AGE)
log.info(token_contents)
except signing.BadSignature:
return None
try:
user = User.objects.get(email=token_contents['email'])
except User.DoesNotExist:
user = User(
username=self.username_from_email(token_contents['email']),
password=self.random_password()
)
user.save()
return user
def random_password(self):
return ''.join(random.choice(string.ascii_uppercase + string.digits)
for _ in range(10))
def username_from_email(self, email):
return email.split('@')[0]
来自settings.py:
AUTHENTICATION_BACKENDS = (
'myapp.auth.TokenBackend',
'django.contrib.auth.backends.ModelBackend'
)
答案 0 :(得分:0)
糟糕。我没有在TokenBackend.get_user
中退回用户。