龙卷风认证如何运作?

时间:2018-06-04 11:14:08

标签: python tornado tornado-redis

如何使用set_secure_cookie方法在龙卷风中进行身份验证? 哪些cookie存储在多个用户的哪里? 我们如何验证框架内的每个API调用?

1 个答案:

答案 0 :(得分:0)

Cookie只是HTTP标头。没什么特别的。 Cookie的工作方式如下:

  1. 浏览器向服务器发送请求。这可以通过任何请求,如常规页面请求或登录表单提交。对于此示例,我们只讨论登录请求。
  2. 服务器会查看提交的usernamepassword,并确保它们正确无误。然后,服务器将在此浏览器上设置cookie,以便稍后识别用户。要设置cookie,服务器将发送一个名为Set-Cookie的标头以及响应。它看起来像这样 - Set-Cookie: sessionId=username
  3. 当浏览器收到回复时,它还会注意到响应中有SET-COOKIE标题。现在浏览器会在计算机的某个位置保存这个值,这并不重要。重要的是,在此之后,只要浏览器将请求发送到您的服务器,它也会在请求标头中发送此cookie - Cookie: sessionId=username
  4. 下次,服务器还会注意到请求中的Cookie标头。因此,它将从那里获取登录用户的用户名。
  5. 这就是cookie的工作原理。

    现在回答你的问题:

      

    如何使用set_secure_cookie方法在龙卷风中进行身份验证?

    您可能已经注意到上述示例中存在严重的安全漏洞。为了识别用户,我们在纯文本中设置了sessionId值。任何人都可以轻松地在cookie中发送不同的用户名,我们的服务器会将其视为该用户。例如,如果Alice想破解Bob的帐户,她所要做的就是像这样发送会话cookie - Cookie: sessionId=bob。我们的服务器将Alice视为Bob。

    这是set_secure_cookie方法的用武之地。它将设置一个签名的令牌,而不是普通的用户名。 Tornado将根据您的cookie_secret设置值设置已签名的Cookie。这是安全的,因为cookie是基于cookie_secret签名的,没有人知道接受你。 Cookie将如下所示 - sessionId=slsafj7987LJflsfslfljk68686sfj。现在,爱丽丝不能冒充鲍勃。

      

    为多个用户存储这些cookie的位置?

    无处。由于cookie已签名,因此Tornado将在请求进入时解码签名cookie中的值。例如,如果Cookie标头如下所示:Cookie: sessionId=alksjfl98798yfaslkdjf。 Tornado将解码此 - alksjfl98798yfaslkdjf值以提取编码的用户名。它是即时发生的。

      

    我们如何验证框架内的每个API调用?

    API调用是否需要会话,例如用户身份验证,以便用户可以查看和编辑他们的帐户等?那么你需要的只是set_secure_cookie方法 如果API调用彼此独立,那么您应该让您的用户使用带有"访问密钥"的API。您需要将这些访问密钥存储在数据库中。您的用户将以HTTP标头或请求查询参数的形式向每个请求发送此访问密钥:

    # as a header
    API-Access-Key: <long-random-key>
    
    # OR as a query string
    http://yourserver.com?key=<long-random-key>