我们是不是应该在很大程度上基于本地 jwt 令牌到期日期来验证用户
Posted
技术标签:
【中文标题】我们是不是应该在很大程度上基于本地 jwt 令牌到期日期来验证用户【英文标题】:Should we base heavily on local jwt token expiry date to authenticate user我们是否应该在很大程度上基于本地 jwt 令牌到期日期来验证用户 【发布时间】:2017-08-26 07:42:05 【问题描述】:我正在通过网络上的一些教程学习 angular2。使用 jwt 令牌创建登录页面时,许多示例方法如下: - 当用户输入电子邮件和密码时,提交事件将调用身份验证api - 成功的身份验证将在有效负载中返回一个带有到期日期的令牌。此令牌存储在本地存储中 - 受限路线导航将通过 getItem 从 localstorage 检查经过身份验证的用户,检查令牌的存在和到期日期
我的问题是: 我可以使用 localstorage 中的令牌轻松访问 jwt.io,稍后将到期号更改为其他值,复制新生成的令牌并手动粘贴回 localstorage 项
我的想法: 在任何路线导航之前调用 api tokenValidation,似乎会引入大量服务器调用
欣赏你的想法
【问题讨论】:
【参考方案1】:不,你不能那样做。 JWT 令牌的全部意义在于它们是加密签名的,使用只有服务器知道的密钥。因此,如果您尝试篡改令牌中的到期日期或其他任何内容,服务器将检测到签名不匹配,并将拒绝令牌。
所以是的,您将能够转到受保护的路由,但是一旦您尝试发出 HTTP 请求,您就会从后端收到一个错误(或者至少您应该强>得到一个)。客户端保护并不是真正的安全措施:组件的代码无论如何都可以在下载的包中找到。这是一种符合人体工程学的措施:例如,如果用户无法访问某个路线,他/她可以自动重定向到登录页面。
【讨论】:
我的问题是我不希望用户查看某些页面。假设用户在第 1 页,填写一些个人详细信息,然后导航到第 2 页并在第 2 页停留太久或离开应用程序太久。当他们回来时,他们可以篡改本地到期日期,以便他们可以导航回第 1 页以查看个人详细信息。 第 1 页从哪里获取个人详细信息?从服务器,对吧?所以它会向后端发送一个 HTTP 请求,在授权标头中包含 JWT,对吧?服务器会检查这个令牌,然后发回一个错误,对吧?因此页面将无法从后端获取任何个人详细信息。 据我所知,如果用户输入或下载信息,它至少会存储在内存中,这样当我们从第 2 页返回时,我们不需要向服务器发送另一个请求.因此,当用户重新使用应用程序时,内存中的所有数据可能仍然存在,并且在篡改令牌后,他们将能够导航回第 1 页并查看所有信息。如果我错了,请纠正我。谢谢JB 如果您将其存储在内存中并从内存中加载用户详细信息,它会保留在内存中。如果您不这样做,则不会,而是从服务器获取数据。 即使我们从服务器获取数据,它也会在内存中,这样当我们从其他页面导航到/返回时,我们不需要再次调用相同的 api,对吗?以上是关于我们是不是应该在很大程度上基于本地 jwt 令牌到期日期来验证用户的主要内容,如果未能解决你的问题,请参考以下文章