【问题标题】:How to remember user using jwt even after browser closes?即使在浏览器关闭后如何记住用户使用 jwt?
【发布时间】:2015-03-12 05:20:25
【问题描述】:

我正在尝试在我的 expressjs、nodejs 和 angularjs 应用程序中使用 jsonwebtoken 和 express-jwt 为我的用户身份验证实现 json Web 令牌。我阅读了各种文章和教程,现在我对某些事情感到有些困惑。

首先我对 JWT 的理解是它由句号分隔的三部分组成:

  1. 标头:描述 jwt 和算法。
  2. 有效负载:包含信息:发行者、受众、到期日
  3. 签名:基于头部和负载的签名

因此,每个请求都是使用令牌发出的,该令牌在服务器上进行验证。根据this 文章,issuer 是提出请求的人。在用户认证的情况下,用户是颁发者。现在使用express-jwt中间件,验证请求头中的令牌并将解码的令牌附加到req.user:

app.use(expressJwt({ secret: jwtSecret }).unless({ path: [ '/login' ]}));

有效载荷的长度可以是多长?以及如何以及在哪里保存客户端的令牌,以便即使在浏览器关闭后我的会话仍然存在,除非用户注销,如 facebook 的“保持登录”?因为我不希望令牌过期时提示用户再次登录,所以我希望令牌更新,除非用户注销。

【问题讨论】:

    标签: node.js express jwt express-jwt


    【解决方案1】:

    您可以将 JWT 存储在持久性 cookie 或 browser local storage 中。有效载荷的长度不受 JWT 本身的限制,而是受存储的限制。请记住,长令牌可能会给您的请求增加大量负载,或者可能需要额外的服务器配置以允许超长的 HTTP 标头。

    如果您不希望 JWT 令牌过期,请在颁发它们时相应地设置过期时间。如果由于用户无法撤销 JWT 泄漏,这是一个额外的安全风险。

    【讨论】:

    • 我希望 JWT 持久化。因为我不想提示用户登录,除非他退出系统。如果我们将jwt存储在localStorage中,浏览器关闭后jwt会被销毁吗?
    • 如 w3schools 页面所述:HTML 本地存储提供了两个对象用于在客户端存储数据:(1) window.localStorage - 存储没有过期日期的数据和 (2) window.sessionStorage - 存储一个会话的数据(关闭选项卡时数据丢失)。所以 - 是的,当浏览器窗口关闭时,localStorage 不会丢失。
    • 无法撤销 JWT 令牌。所以,如果有人偷了你的手机并且那个令牌没有过期日期......坏消息。
    • @dman 实际上这并不完全正确......如果您在用户上创建一种“散列”ID,仅用于 JWT 中的 sub 声明,如果令牌被泄露,只需更新用户的哈希 ID,令牌的 sub 不会与具有该 ID 的用户匹配,所以它就像被撤销一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 2015-07-21
    • 2018-05-10
    • 1970-01-01
    • 2014-01-16
    • 2022-11-11
    • 2011-12-09
    相关资源
    最近更新 更多