【问题标题】:Django/DRF/JWT doesn't go to the DB when authenticating token, but request.user has all the details?验证令牌时,Django/DRF/JWT 不去数据库,但 request.user 有所有详细信息吗?
【发布时间】:2017-11-26 03:31:13
【问题描述】:

这怎么可能

  1. JWT 不会通过数据库对用户进行身份验证
  2. request.user 是一个功能齐全的对象,所有字段都已填充。

哪一个是真的?

  1. 数据库使用
  2. User 的每个字段都被编码到令牌上,并在请求时解码以使其可用。

【问题讨论】:

  • 第二个是真的。
  • 虽然 jwt 在提供 jwt 令牌之前会验证凭据

标签: django django-rest-framework jwt


【解决方案1】:

第二个选项是真的。

JWT 基于 userpassword 等生成令牌。当从客户端收到时,服务器对其进行解码,并验证收到的信息。

这是一个很好的图表:

如果您转到https://jwt.io/ 中的调试器,您将看到令牌的组成。标题 - 有效负载 - 验证签名。如果需要深入讲解,可以开始here

在 DRF-JWT 的情况下,您可以在 here 中看到 jwt 令牌的有效负载是如何制作的。

【讨论】:

  • 这很奇怪。如果负载没有从用户返回所有字段并且没有调用任何数据库,那么当我开始处理 API 调用时,我怎么能看到我的 request.user.first_name 值?
  • 负载包括user.pk。 DRF & DRF-JWT 处理令牌,获取 pk,请求用户,并将其注入 request 对象,使其可供您使用。
  • (我只在你的图表中谈论案例#4 - 这是我提出的要求)。所以我可以在request.user.first_name 下看到有效值,因为我访问了request.user.first_name,这使得Django 的ORM 继续前进并为它访问数据库?如果我只需要user.pk 来处理请求,则数据库不会被命中,因为user.pk 已经从解密的令牌中存在,对吧?只有当我访问request.user.<field_not_in_the_token> 时,数据库才会被击中。这是一个准确的假设吗?
  • 不,DRF JWT会一直打db来检索用户,检查github.com/GetBlimp/django-rest-framework-jwt/blob/master/…基本上,一旦服务器收到token,如果有效,就从db中检索用户,所以,db是打。您制作的request.user.first_name 用户已经从数据库中检索到。成本是最低的,你不应该担心它。有什么理由需要知道数据库是否被击中?
  • 与传统令牌系统的区别在于,使用 jwt 您不需要将令牌存储在数据库中。 django 的任何身份验证都会从数据库中获取用户,除非有一个选项可以阻止,我不知道,例如,您应该从 drf-jwt 读取每个设置。
猜你喜欢
  • 1970-01-01
  • 2018-12-29
  • 2018-04-07
  • 2018-03-05
  • 2018-03-17
  • 1970-01-01
  • 2018-08-12
  • 2018-08-25
  • 1970-01-01
相关资源
最近更新 更多