我有一个Django应用程序,其中有2个用例我希望用户无需密码即可登录。
链接包括我验证的一次性密钥,然后我想在不使用凭据的情况下登录用户。
# This raises an exception unless
# I call user.authenticate 1st.
auth.login(request, user)
我如何实现这一目标?
答案 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)
这里有一个工作代码段,可以在不需要凭据的情况下登录用户。
答案 3 :(得分:1)
答案 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)
我认为这两种情况都不应算作“登录”。应通过不需要身份验证的视图将它们作为特殊情况处理。