在我的网络应用中,我希望能够通过电子邮件向用户发送自我身份验证链接。这些链接将包含唯一标记(uuid)。当他们点击链接时,查询字符串中出现的令牌就足以对他们进行身份验证,他们也不必输入用户名和密码。
最好的方法是什么?
答案 0 :(得分:3)
如果你的链接正常到期,那是很常见的任务:)你需要实现自己的身份验证后端。您不会检查用户名和密码参数,而是检查auth_link。
class AuthLinkBackend(object):
def authenticate(auth_link = None):
if auth_link:
# validate and expire this link, return authenticated user if successful
return user
将后端类添加到后端列表中(AUTHENTICATION_BACKENDS设置)。
在链接验证视图中,您应该尝试对用户进行身份验证,如果成功,请登录他/她:
user = auth.authenticate(auth_link=link)
if user:
auth.login(request, user)
答案 1 :(得分:1)
从安全角度来看,这似乎是一个非常糟糕的主意。
那说,它仍然可以完成。我希望你计划只在内部或某种公司内部网上使用它。对于一个现场的,在网上,合法的网站,这可能只是在寻找麻烦。
您可以通过创建中间件组件来处理传入请求。
(未经测试,但总体思路)
import base64
class UUIDQueryStringMiddleware(object):
def process_request(request):
if request.method == 'GET':
if not request.user.is_authenticated():
uuid = request.REQUEST.get('u', None)
if uuid:
username = base64.b64decode(uuid)
try:
user = User.objects.get(username=username)
request.user = user
except:
pass
# Pass the original request back to Django
return request
然后,您需要将此中间件设置为在auth和会话中间件运行之前运行...
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'yourapp.middleware.UUIDQueryStringMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
)
有关编码/解码的详细信息,请参阅此问题:encrypt & decrypt strings in python
我真的希望你不会在现场网站上使用它。
答案 2 :(得分:1)
至于T. Stone的观点,最终用户因传递链接而臭名昭着 - 特别是那些处于intraweb环境中的人。拥有对用户进行自动身份验证的内容意味着我几乎可以保证您将至少有一个人像其他人一样登录。
当然,有更好的方法可以从Cookie信息中刷新用户的会话,因此您至少可以认为他们是一个有效的用户连接到有效的浏览器,并且可以感觉更安全,因为他们不是'可能会像他们的链接一样交出他们的笔记本电脑,但是是......重申一下,如果你的应用有超过1个用户,那么你想要做的是一个非常糟糕的主意。