Django:基于 DRF 令牌的身份验证 VS JSON Web 令牌

Posted

技术标签:

【中文标题】Django:基于 DRF 令牌的身份验证 VS JSON Web 令牌【英文标题】:Django : DRF Token based Authentication VS JSON Web Token 【发布时间】:2015-10-14 12:49:03 【问题描述】:

我正在构建一个真实世界的应用程序,用户将主要从 androidios 设备以及桌面访问该应用程序。

从我的初步研究中,我意识到,与基于会话的身份验证相比,基于令牌的身份验证机制对于客户端-服务器模型来说更好更优雅。

在 Django 中,我发现了两种流行的方法 -

    http://www.django-rest-framework.org/api-guide/authentication/#tokenauthentication http://getblimp.github.io/django-rest-framework-jwt/

据我了解,选项 2] 是 1] 的扩展,除了 Token 是 JSON(序列化)的形式。我想了解选项 1] 和 2] 之间还有哪些其他区别以及选择其中任何一个的优点/缺点。

【问题讨论】:

我有一些类似的设置。我所做的是,对于我的应用程序客户端令牌身份验证有效,但对于我的 Web 客户端会话身份验证有效。不确定 JWT 会提供什么优势? Appropriate choice of authentication class for python REST API used by web app 的可能副本 FWIW, django-rest-framework-simplejwt 似乎得到维护,而django-rest-framework-jwt 没有。 【参考方案1】:

他们都执行相似的任务,几乎没有区别。

令牌

DRF 的内置令牌认证

    一个令牌用于所有会话 令牌上没有时间戳

DRF JWT 令牌认证

    每个会话一个令牌 每个令牌的到期时间戳

数据库访问

DRF 的内置令牌认证

    获取与令牌关联的用户的数据库访问权限 验证用户状态 验证用户身份

DRF JWT 令牌认证

    解码令牌(获取有效负载) 验证令牌时间戳(到期) 数据库访问以获取与有效负载中的 id 关联的用户 验证用户状态 验证用户身份

优点

DRF 的内置令牌认证

    允许通过替换数据库中的令牌来强制注销(例如:密码更改)

DRF JWT 令牌认证

    具有过期时间的令牌 除非令牌有效,否则不会命中数据库

缺点

DRF 的内置令牌认证

    数据库命中所有请求 所有会话的单一令牌

DRF JWT 令牌认证

    如果不在数据库中跟踪令牌,则无法调用它 令牌发出后,任何拥有令牌的人都可以提出请求 规范可以解释,对于如何进行刷新没有达成共识

【讨论】:

对不起,我不明白你的回答。你能澄清一下吗?您是说选项 1 需要记住会话中的用户,而选项 2 只需检查请求 URL 中的用户名,因此选项 2 不需要会话? @SanderVandenHautte 我在答案中添加了更多细节。希望对你有帮助 谢谢!这很有帮助。 @un33k 你能详细说明一下吗? > 规格可以解释,关于如何刷新没有共识 @sphoenix 这是一个复杂的话题,*** 不适合进行详细分析。请使用以上作为利弊的参考。然后您可以参考您的设计需求和软件包来找出最适合您的。请注意,身份验证没有灵丹妙药,您选择的任何东西都会产生副作用。我们的使命是尽量减少对您要求的副作用。如果我要推荐一些东西,那就是签名-http cookie 用于身份验证和 JWT 用于授权。 Cookie 有效期 2 周,JWT 每 15 分钟刷新一次。

以上是关于Django:基于 DRF 令牌的身份验证 VS JSON Web 令牌的主要内容,如果未能解决你的问题,请参考以下文章

无法使用用户名/密码登录令牌端点:drf 令牌身份验证和自定义用户模型,Django

Django Rest 框架中的基于会话的与令牌身份验证

Drf令牌认证密码重置

从 Django Rest Framework 中的令牌获取经过身份验证的用户

检测用户首次使用 Django Rest Framework 进行身份验证

带有 okta OAUTH 令牌身份验证的 Django Rest API