Django无需验证即可登录

lim*_*der 10 django

我有一个Django应用程序,其中有2个用例,我希望用户能够在没有密码的情况下登录.

  1. 用户在电子邮件中注册并获取激活链接.
  2. 用户重置密码并获取链接以在电子邮件中更改密码表单.

链接包括我验证的一次性密钥,然后我想在不使用凭据的情况下登录用户.

# This raises an exception unless
# I call user.authenticate 1st.
auth.login(request, user)
Run Code Online (Sandbox Code Playgroud)

我怎么做到这一点?

sup*_*ghs 17

您可以使用所描述的方法在这里 Django文档.您根据提供的一次性密钥获取用户并调用login(request,user).这里的问题是你需要手动指定身份验证后端,因为你不是先调用authenticate().

from django.contrib.auth import login

def my_view(request):

    // your user retrieval code
    ...

    user.backend='django.contrib.auth.backends.ModelBackend'
    login(request, user)
Run Code Online (Sandbox Code Playgroud)


Mar*_*vin 4

您可以编写自己的身份验证后端来处理您的两个用例。请参阅有关编写和使用自定义身份验证后端的文档: http://docs.djangoproject.com/en/1.2/topics/auth/#other-authentication-sources

编辑:似乎对于编写自己的身份验证后端有多困难可能存在一些误解。来自文档:

身份验证后端是一个实现两个方法的类:get_user(user_id) 和authenticate(**credentials)。

这是正确的。它是实现两个都返回User对象的函数的任何类。

get_user 方法接受一个 user_id —— 可以是用户名、数据库 ID 或其他任何东西 —— 并返回一个 User 对象。

...authenticate 应该检查它获取的凭据,如果凭据有效,它应该返回与这些凭据匹配的 User 对象。如果它们无效,则应返回 None。

OP 已经声明这些链接包含他验证的一次性密钥(并且可能与他希望登录的用户关联)。换句话说,他已经编写了后端的业务逻辑,他只需要将其转换为适当的类即可。

自定义身份验证后端可以在 Django 1.2 中执行许多很棒的操作,例如对象级权限,但它们不必那么复杂。另外,它们可以堆叠,因此您可以将基于令牌的身份验证与默认模型后端或 OpenID 或 Facebook 混合在一起。但最终,身份验证后端只是具有两种方法的类,我不明白你怎么能称之为过度杀伤力。