Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django中的自认证链接_Python_Django_Authentication - Fatal编程技术网

Python Django中的自认证链接

Python Django中的自认证链接,python,django,authentication,Python,Django,Authentication,在我的web应用程序中,我希望能够通过电子邮件向用户发送自我验证链接。这些链接将包含唯一令牌(uuid)。当他们单击链接时,查询字符串中的令牌将足以对他们进行身份验证,并且他们不必输入用户名和密码 最好的方法是什么?从安全角度来看,这似乎是一个非常糟糕的主意 尽管如此,它仍然可以做到。我希望您计划只在内部或公司内部网之类的东西上使用它。对于一个在线、合法的网站来说,这可能只是自找麻烦 您可以通过创建中间件组件来处理传入请求 (未经测试,但总体思路) 然后,您需要将此中间件设置为在auth和ses

在我的web应用程序中,我希望能够通过电子邮件向用户发送自我验证链接。这些链接将包含唯一令牌(uuid)。当他们单击链接时,查询字符串中的令牌将足以对他们进行身份验证,并且他们不必输入用户名和密码


最好的方法是什么?

从安全角度来看,这似乎是一个非常糟糕的主意

尽管如此,它仍然可以做到。我希望您计划只在内部或公司内部网之类的东西上使用它。对于一个在线、合法的网站来说,这可能只是自找麻烦

您可以通过创建中间件组件来处理传入请求

(未经测试,但总体思路)

然后,您需要将此中间件设置为在auth和sessions中间件运行之前运行

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'yourapp.middleware.UUIDQueryStringMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
)
有关编码/解码的更多详细信息,请参阅此问题:


我真的希望你不要在实时网站上使用它。

对于T.Stone来说,终端用户因为到处传递链接而臭名昭著,尤其是那些在intraweb环境中的用户。自动对用户进行身份验证意味着我几乎可以保证您将至少有一个人以其他人的身份登录


当然,有更好的方法可以从Cookie信息中刷新用户的会话,因此您至少可以有一个不错的想法,即他们是连接到有效浏览器的有效用户,并且可以感觉更安全,因为他们不太可能像通过链接一样将笔记本电脑交给他人,但是是的。。。重申一下,如果你的应用程序有超过1个用户,你想做的是一个非常糟糕的主意。

如果你的链接正确过期,这是一个非常常见的任务:)你需要实现自己的认证后端。您将检查auth_链接,而不是检查用户名和密码参数

class AuthLinkBackend(object):
  def authenticate(auth_link = None):
    if auth_link:
      # validate and expire this link, return authenticated user if successful
      return user
将您的后端类添加到后端列表(身份验证\后端设置)

在“链接验证”视图中,您应该尝试对用户进行身份验证,如果验证成功,请登录他/她:

user = auth.authenticate(auth_link=link)
if user:
  auth.login(request, user)

它不仅可以传递,还可以保存在大多数web浏览器的历史记录中,供其他人以后访问,还可以登录代理和各种东西。我希望这些令牌可以一次性使用。如果我添加这些限制,会怎么样:1)只有一个@login\u必需的视图可以通过这种方式进行身份验证。此视图不允许对任何帐户信息进行读写访问。2) 一旦令牌用于单个登录,它就会失效。你觉得这些步骤足够吗?你知道我该怎么办吗?我认为它与您的中间件逻辑非常相似,只是它运行在自定义身份验证后端。但是我如何处理用户刷新页面的问题呢?@awolf:我认为你的思路是对的。您可能需要考虑的是令牌是用户信息的散列和它们被认证的位置。通过这种方式,您可以使用@Yaroslav的答案,而无需使用
auth.login()
,它将对整个会话的用户进行身份验证。一旦调用
auth.login(请求,用户)
,此使用现在在会话中进行身份验证,对吗?这意味着如果苏西给汤米发送了一个经过苏西认证的链接,汤米就可以访问苏西所做的一切?这似乎有点不安全?@Jack,原始海报提到一旦使用了auth链接,他将使其失效。顺便说一句,当你点击链接,输入新密码并立即登录时,使用“重置密码”功能是一种常见的做法。“如果你的链接正确过期,这是一项非常常见的任务。”-在自验证URL的上下文中,某些链接不应过期。例如,我知道Python使用它们对包进行身份验证。如果存在包含包的令牌/哈希的网页,则包是可信的。如果包不真实或被篡改,那么服务器将返回404。在一段时间后删除包网页是没有意义的。Peter Gutmann在他的书中谈到了自我验证URL。
user = auth.authenticate(auth_link=link)
if user:
  auth.login(request, user)