拥有 JWT 后如何获取用户的数据

Posted

技术标签:

【中文标题】拥有 JWT 后如何获取用户的数据【英文标题】:How to fetch user's data once they have a JWT 【发布时间】:2020-11-01 13:10:15 【问题描述】:

我在我的电子商务网站上使用 JWT 进行用户身份验证。用户成功登录后,我会向他们发送一个存储在浏览器本地存储中的 JWT。

一旦客户端拥有 JWT,我是否正在尝试找出让客户端为该用户获取特定数据的最佳(或标准化)方式?这些数据包括他们的购物车、愿望清单、订单历史等。我可以想到几个可能的解决方案:

    在 JWT 中包含所有数据。这可能是错误的方法。似乎只有 user_idphone_numberemail_address 等数据应该存储在 JWT (source) 中。

    允许客户端从 JWT 解析 user_id(例如 75)。然后客户端点击/users/75(认证需要JWT)来获取用户的数据。但是,这似乎是多余的,因为端点和 JWT 都指向用户。

    创建一些端点,例如 /user/shopping_cart/user/wishlist 供客户端命中(身份验证需要 JWT)。后端将根据 JWT 确定哪个用户正在发出请求。这似乎是更好的选择。

我敢打赌选项 3 是最好的方法?

【问题讨论】:

【参考方案1】:

方法一,将所有内容存储在 JWT 中:

每次用户更新他们的购物车或愿望清单时,您都必须生成一个新的 JWT 并将其返回给用户。您不想在用户执行的每个操作(添加/更新/删除)上生成一个新令牌。虽然您可以在 JWT 中对数据进行编码以进行初始数据加载。

方法 2,用一个请求返回所有内容

这种方法适用于少量数据和相互关联的数据。例如,在某些情况下,您可能希望在单个页面上显示 # 购物车中的商品数量、愿望清单商品的数量、他们的订单总数。在这种情况下,您可以制作类似 /dashboard 的内容,它会返回有关用户的基本信息。

GET: /dashobard

  wishlists: 5,
  totalOrders: 100,
  cartItems: 10,

方法 3

我会采用这种方法。随着您的应用程序的增长和大量用户的使用,他们将拥有多个愿望清单和多个过去的订单历史记录,并且您的应用程序可能有单独的页面来显示这些信息。在这种情况下,为每个资源设置单独的路由是个好主意。

GET: /users/1/wishlists/  --> get all wishlist of user 1
DELETE/UPDATE: /users/1/wishlists/10/ --> update wishlist with id 10 of user 1

GET: /users/1/orders --> get all orders of user 1

您可以结合所有方法并相应地使用

【讨论】:

【参考方案2】:

可以在客户端或后端存储一些信息,如购物篮物品,正如你所说,你可以保存信息并通过用户 ID 获取它们,但一些信息可以像购物车一样存储在 localstorage 中,在后面最终获取速度很重要,我建议在后端使用 redis 来处理简单信息之类的东西。

【讨论】:

以上是关于拥有 JWT 后如何获取用户的数据的主要内容,如果未能解决你的问题,请参考以下文章

身份验证后请求其他服务时如何从 JWT 令牌获取用户名?

Django JWT auth:如何获取用户数据?

如何使用 JWT 身份验证获取登录用户信息?

使用 HTTP 基本身份验证获取 JWT 令牌的安全性如何?

如何从角度 6 中的“响应标头”获取 JWT 令牌

在 cookie 中存储 JWT 令牌后,如何在 ASP.NET Core 3.1 中破坏该 cookie 并获取信息