这种基于 JWT 的身份验证方法安全吗?

Is this JWT based authentication method safe?

尝试使用 JWT 为 API 实现安全身份验证方法,这将被许多客户端使用,包括 Web(单页应用程序)、桌面、移动我想出了这个系统:

  1. 客户端调用 /auth/login 并设置了用户名和密码
  2. 验证服务器 returns 两个令牌后 auth_token 和 refresh_token
    • 授权令牌仅存在 15 分钟,并在随后的每个 API 调用中使用
    • 刷新令牌的寿命很长,可能会持续 12 小时到一周,但使用格式为 user_pass + long_string
    • 的密钥进行签名
  3. 令牌过期后调用 /auth/renew
    • 发送授权令牌以检查其过期时间(不超过一个小时)
    • 同时发送刷新令牌并使用用户密码进行验证
    • 如果刷新令牌未过期且授权令牌长时间未过期,则发回新的授权令牌
    • 如果用户的密码已更改,则刷新令牌无效,用户需要在其现有的短期授权令牌过期后重新进行身份验证

虽然有一个小 window 验证令牌已过期但仍然有效,并且对数据库进行了调用;这是使用 JWT 进行身份验证以及处理密码更改和令牌刷新的整体安全方式吗?

不要尝试实施您自己的身份验证基础结构。您获得安全实施的机会微乎其微,现在您还必须维护所有这些代码。

最好使用信誉良好的授权服务器,例如 Thinktecture IdentityServer or Azure Active Directory 并使用标准库和协议。

我发现你的提案存在一些问题:

  1. 如果您不签署访问令牌,是什么阻止我更改 里面的主张?
  2. 如果您需要用户密码来验证刷新令牌,则必须以可以明文检索的方式存储它。密码应仅存储为加盐哈希,以防止您获得明文。