用户身份验证与会话身份验证有何不同

Posted

技术标签:

【中文标题】用户身份验证与会话身份验证有何不同【英文标题】:How user authentication is different than session authentication 【发布时间】:2020-10-06 20:56:06 【问题描述】:

我是 Django 新手,我正在尝试编写一些 API。 Django 具有基于用户的身份验证request.user.is_authenticated() 来检查是否有有效用户登录。 还有会话认证。

    会话身份验证与 Django 基于用户的身份验证有何不同?

    哪个更安全?我正在尝试编写调用第三方 API 的其余 API。

    不使用模型是否可以使用tastepie SessionAuthentication?

我没有找到任何在没有模型的情况下实现了 sweetpie 的 REST API 示例。

【问题讨论】:

什么是“基于用户的身份验证”? request.user.is_authenticated() 尝试在会话表中查找用户发送的 cookie。如果 cookie 在 db 中存在,则表示客户端已通过身份验证。 “基于用户的身份验证”和会话身份验证之间没有区别。它们是一回事。 会话身份验证不同于 is_authenticated。 is_authenticated 是始终为 True 的只读属性(与始终为 False 的 AnonymousUser.is_authenticated 相对)。这是一种判断用户是否已通过身份验证的方法。这并不意味着任何权限,也不会检查用户是否处于活动状态或具有有效会话。即使通常您会检查 request.user 上的此属性以了解它是否已由 AuthenticationMiddleware(代表当前登录的用户)填充,但您应该知道该属性对于任何 User 实例都是 True。 啊,是的。原谅我的错误。我应该说 Django 会将request.user 设置为当前登录的用户,它通过查看 cookie 并在会话表中找到匹配项来确定该用户。所以,request.user.is_authenticated 通过代理仍然是基于会话的身份验证。 【参考方案1】:

这通常取决于您希望如何进行身份验证,它们都是安全的,但是当您没有 SSL 连接时,会话身份验证通常更安全。基本身份验证意味着您每次想要从 API 获取任何内容时都必须发送用户电子邮件和密码(凭据),而会话身份验证使用存储在浏览器(或任何应用程序)中的 cookie 中的会话令牌) 以便进行身份验证并让服务器知道您就是您。

如果你对 Node 有一点了解(如果你不了解 Node 也可能有用),我完全建议你观看这个演讲 https://www.youtube.com/watch?v=j8Yxff6L_po,在那里,他解释了几乎所有这些差异。但总而言之,我的意思是你可以同时使用这两种身份验证,但我认为会话身份验证更安全,因为你不需要每次都发送用户的凭据。

【讨论】:

如果没有 SSL,cookie/session 身份验证也容易受到攻击。攻击者可以窃取其他人的令牌以伪装成不同的用户。 我知道,我的意思是“更安全”,因为令牌通常会在一段时间后更新,具体取决于网络,因此如果有人偷了它,它只会在一段时间内有效,而如果他们偷了您的密码和电子邮件,它们可以充当您并造成更大的损害。

以上是关于用户身份验证与会话身份验证有何不同的主要内容,如果未能解决你的问题,请参考以下文章

身份验证:JWT 使用与会话

Django Rest Framework + React - 令牌与会话身份验证

node.js 的用户身份验证库?

《白帽子讲WEB安全》学习笔记之第9章 认证与会话管理

向 IBM Worklight 添加虚拟身份验证以创建新会话

spring security - 针对不同 CURL 模式的多重身份验证