使用自定义身份验证后端

时间:2015-06-22 21:28:58

标签: python django authentication django-authentication

在我的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'
)

1 个答案:

答案 0 :(得分:0)

糟糕。我没有在TokenBackend.get_user中退回用户。