这种基于 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 进行嵌套身份验证和授权是一回事吗?