Django无需验证即可登录

时间:2010-09-27 20:53:16

标签: django

我有一个Django应用程序,其中有2个用例我希望用户无需密码即可登录。

  1. 用户在电子邮件中注册并获取激活链接。
  2. 用户重置密码并获取更改密码表单的链接。
  3. 链接包括我验证的一次性密钥,然后我想在不使用凭据的情况下登录用户。

    # This raises an exception unless
    # I call user.authenticate 1st.
    auth.login(request, user)
    

    我如何实现这一目标?

6 个答案:

答案 0 :(得分:17)

您可以在Django文档中使用here中描述的方法。您根据提供的一次性密钥获取用户并调用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)

答案 1 :(得分:4)

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

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

  

身份验证后端是一个类   实现两种方法:   get_user(user_id)和   认证(**凭证)。

没错。它是任何实现两个返回User个对象的函数的类。

  

get_user方法采用user_id -   可以是用户名,数据库ID   或者其他 - 并返回一个用户   对象

     

...验证应检查   它获得的凭据,它应该   返回匹配的User对象   那些凭证,如果凭证   是有效的。如果它们无效,那就是   应该返回无。

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

自定义身份验证后端可以在Django 1.2中执行许多令人敬畏的事情,如对象级权限,但它们不必那么复杂。另外,它们会叠加,因此您可以将基于令牌的身份验证与默认模型后端或OpenID或Facebook混合使用。但最后一个auth后端只是有两种方法的类,我不知道你怎么称之为矫枉过正。

答案 2 :(得分:4)

这里有一个工作代码段,可以在不需要凭据的情况下登录用户。

http://djangosnippets.org/snippets/1547/

答案 3 :(得分:1)

查看django-registration应用,这正是您所需要的:)

修改

django-registration repo

的新链接

答案 4 :(得分:1)

你可以使用ska包,它实现了对Django的无密码登录。 ska与身份验证令牌配合使用,其安全性基于SHARED_KEY,对于所有参与方(服务器)而言,它应该相同。

在客户端(请求无密码登录的一方),您使用ska生成一个网址并对其进行签名。例如:

from ska import sign_url
from ska.contrib.django.ska.settings import SECRET_KEY

server_ska_login_url = 'https://server-url.com/ska/login/'

signed_url = sign_url(
    auth_user = 'test_ska_user_0',
    secret_key = SECRET_KEY,
    url = server_ska_login_url
    extra = {
        'email': 'john.doe@mail.example.com',
        'first_name': 'John',
        'last_name': 'Doe',
    }
    )

令牌的默认生命周期为600秒。您可以通过证明lifetime参数来自定义它。

在服务器端(用户登录的站点),请记住您已正确安装ska,用户 如果它们存在(用户名匹配)或其他 - 创建,则在访问URL时登录。您可以在项目的Django设置中自定义3个回调。

USER_GET_CALLBACK(string):如果从数据库(现有用户)成功获取用户,则触发。 USER_CREATE_CALLBACK(字符串):在创建用户后立即触发(用户不存在)。 USER_INFO_CALLBACK(string):成功验证后触发。

有关详情,请参阅文档(http://pythonhosted.org/ska/)。

答案 5 :(得分:0)

我认为这两种情况都不应算作“登录”。应通过不需要身份验证的视图将它们作为特殊情况处理。