2015-09-27 223 views
2

所以这里是我的场景,我生成了一个jwt令牌,并将该令牌存储在redis中并保存了1小时的TTL。 现在我看到的大多数教程使用jwt.verify验证令牌..我需要验证jwt吗?

我知道他们正在核实令牌是真实与否

为什么我需要使用jwt.verify ..为什么不能我用redis.exists检查令牌是真实的或不..

大多数人说,我们可以用智威汤逊的主要特点是无需使用数据库来检查用户和到期..

但在我的场景我不能存储所有的令牌..所以我使用redis来存储令牌与会话信息。

问题是 1.所以我不应该使用jwt这种情况。 2.我可以跳过jwt.verify吗?

我是一个新手节点..

+2

如果您还在存储令牌,那么您使用jwt获得了什么? –

+0

这就是问题..我没有使用数据库时需要使用jwt吗? – Sathish

+0

继续在这里讨论https:// github。com/dwyl/hapi-auth-jwt2/issues/106 – Sathish

回答

2

智威汤逊可以帮助您快速检索关于调用者的信息,而不会触及数据库(redis也是数据库)。 使用客户端应用程序/外部服务使用的JWT时,您必须始终对其进行验证,以确保您是生成它们并且没有被篡改的人。

存储在JWT中的公共信息包括用户名,真实姓名,组等。在您的场景中,您可以使用JWT存储包含所需信息的Redis键。可能会出现这种情况,您总会碰到redis以获取您想要的信息,所以JWTs不会为您的案例增加很多价值,但它可能会让您可以使用JWT编写只会触及的更聪明的代码在某些情况下redis例如。如果用户有这个权限,或者我们已经在redis中存储了关于此用户的某些信息(缺少来自JWT令牌的redis密钥)

您是唯一可以评估您的场景和JWT的实用性的人不要急于解雇他们,因为他们提供了一个不错的性能/安全改进。

+0

其实我正在用hapi.js编写代理服务器。我不允许传递下游服务发送的cookie和会话信息,而不是那个,我需要生成一个令牌并存储与其相关的信息并将该令牌返回给移动设备和Web浏览器,因此它们不会想要处理饼干。 – Sathish

+0

我的完整需求在这里解释,http://stackoverflow.com/questions/32638095/how-to-use-jwt-for-a-proxy-server-written-using-node-js – Sathish

1

假设Redis的服务器被固定和你产生JWT自己(似乎在这里是如此),则不需要进行验证。一旦创建完成,将其存储在缓存中并在稍后检索,因为您知道它不会在Redis缓存中被篡改,所以无需再次验证。

仅当接收由第三方生成的JWT时,您需要验证它们是否可信。

另一方面,如果您将JWT分发给第三方应用程序和您不控制的客户端,那么您将必须确保一旦他们被重播回给您,它们不会被验证签名(或对存储在Redis缓存中的一个进行二进制比较)和(在使用时)检查exp索赔中的到期时间戳。

+0

这是不正确的。验证是为了确保没有第三方篡改智威汤逊。所以即使你生成了它,如果它已经离开你的服务器(客户端浏览器,外部服务等),它也必须被验证。 – masimplo

+0

同意,但问题并不表明它转到第三方 –

+0

最常见的用例涉及在手机或浏览器上运行的客户端应用程序。 JWT在同一基础架构内部的服务中使用的更加先进,我从这个问题中假设他是一个nodejs新手,在观看教程时实现这一点,但情况并非如此。你可能是对的,但你应该在你的回答中说明“第三方收到**的令牌**”而不是“第三方产生的**”,以便让每个人都清楚。 – masimplo

0

如果没有任何验证,第三方可能会向您的API发送请求,并且在大多数情况下,这些请求可能会变成中间人攻击。保持服务器上生成的所有令牌的记录并随后使用每个传入请求对其进行身份验证是一种很好的安全措施。

+1

由于JWT已签名,无需存储令牌,因此可以在检索时进行验证。如果你存储它们,你将会遇到其他的麻烦,比如确保访问商店并确保它没有被破坏/篡改等。 – masimplo

+0

这个标志很容易被篡改。因此,我提到的最佳做法。 – riyadhalnur

+1

除已公布的漏洞外,您是否有任何引用表明JWT签名可能被篡改? – masimplo