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

Posted

技术标签:

【中文标题】这种基于 JWT 的身份验证方法安全吗?【英文标题】:Is this JWT based authentication method safe? 【发布时间】:2016-03-24 04:07:21 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

不要尝试实现您自己的身份验证基础架构。您获得安全实现的机会很小,现在您还必须维护所有代码。

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

我看到你的提议存在一些问题:

    如果你不签署访问令牌,是什么阻止我改变 里面的索赔? 如果您需要用户密码来验证刷新令牌,您必须以可以明文检索它的方式存储它。密码只能存储为加盐哈希,以防止您访问明文。

【讨论】:

访问令牌将使用单独的访问密钥进行签名,但我在数字 2 中看到了您的观点。我完全忘记了密码将如何存储(使用 bcrypt)。谢谢你的回答。

以上是关于这种基于 JWT 的身份验证方法安全吗?的主要内容,如果未能解决你的问题,请参考以下文章

JWT 令牌基于仪表板应用程序的每个请求的身份验证

使用机器对机器和基于用户的身份验证使用 JWT 进行嵌套身份验证和授权是一回事吗?

Angular 和 Laravel 身份验证 JWT?

添加基于策略的授权会跳过 JWT 不记名令牌身份验证检查吗?

使用JWT 进行基于 Token 的身份验证方法

实施 CSRF 免费 JWT 身份验证的安全方法