【问题标题】:Is it a good practice to send all the User details stored in DB via JWT token?通过 JWT 令牌发送存储在 DB 中的所有用户详细信息是一种好习惯吗?
【发布时间】:2021-09-03 16:11:36
【问题描述】:

我正在使用 MERN 堆栈 并使用 JWT 进行身份验证 开发演示 WebApp。

在后端,当用户请求登录时,我正在准备一个 JWT 令牌,方法是在令牌的有效负载中添加该用户的 MongoDB ObjectID 和必要的时间戳。

在用户登录时,我想将该会话的用户详细信息存储在前端。 我知道我可以通过 API 响应共享所有这些细节并使用 React Context/Redux 存储它。但是,在登录期间从后端创建一个 JWT 令牌并将所有特定于会话的用户详细信息(除了安全信息)存储到有效负载中并在响应中发送加密令牌是一种好习惯吗?这样,我就可以从 JWT 令牌中解密和解构用户详细信息,并将它们存储在该会话中。

渴望了解上述过程的优缺点,同时考虑最佳编码实践。

【问题讨论】:

    标签: node.js reactjs authentication jwt mern


    【解决方案1】:

    您似乎需要来自 OpenID Connect (https://openid.net/) 的 ID 令牌之类的东西。这是一个 JWT,其中包含在前端用于识别用户的用户数据,可能在某处打印他们的用户名等。使用它是一种常见的做法,但你应该记住,如果你在该令牌中放入太多信息,它将得到相当大(可能会影响较慢的连接,或者需要解码、验证签名等的较慢计算机)

    另一个可行的选择是有一个端点,它在需要时返回所有信息(请参阅 OIDC 中的 userinfo 端点)。

    您还必须记住,任何有权访问该 JWT 的人都可以读取所有这些信息,因此不应在其中保留任何个人信息。

    请注意 - I can decrypt & destructure the user details from the JWT token - 你可能是指 decode 这里。解码是将 JWT 从 base64 编码字符串更改为 JSON 对象的行为。你可以拥有真正加密的 JWT (JWE),它可以保护它们不被窃听者读取,但你不会在前端应用程序中使用它们。它们的设置和使用更多 CPU 也更加复杂。

    【讨论】:

    • 非常感谢,伙计。我也同意保留所有细节会使 JWT 变得非常大并导致连接问题。但是,如果我在将其发送到前端之前使用一些散列技术对其进行加密,以便窃听者无法读取它会怎样:) 我想这可能是小型应用程序的一个选项,但对于大型应用程序,它是最好创建一个端点来提供用户详细信息作为响应。
    • 除非绝对需要,否则我不会使用加密。加密需要您管理证书和密钥,并且会变得相当复杂。此外,如果您在前端应用程序中需要令牌,那么加密将无济于事,因为任何有权访问该应用程序的人也可以访问解密令牌所需的任何密钥。
    猜你喜欢
    • 2020-05-27
    • 2020-06-10
    • 2022-09-30
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    相关资源
    最近更新 更多