2017-07-03 61 views
4

我正在用ExpressJS,Mongodb(Mogoose)构建应用程序。应用程序包含用户在访问之前必须经过身份验证的路线。我应该在Redis中存储JWT令牌吗?

目前我写了一个快递中间件来做同样的事情。在这里借助JWT令牌,我正在进行mongodb查询以检查用户是否已通过身份验证。但感觉这可能会给我的数据库带来不必要的请求负载。

我应该为此特定任务整合redis吗?
它会改善API性能吗?或者应该继续使用现有的 mongodb方法?

会对我有帮助。

+0

为什么你需要存储JWT令牌? JWT是不是用于无状态身份验证,您不需要在服务器端存储令牌,而是让客户端保持它,您只需验证签名以查看数据是否真实。所以服务器端无状态的好处是你不需要担心会话相关的问题,你正在做的与此相反。 –

+0

@Redisson_RuiGu谢谢,理解你的观点。 什么是正确的方式来查找用户进行身份验证或不,1)如果后jwt.verify()返回一些有效的标记(我相信这是足够的),2)或者我应该采取此标记并检查与数据库(I觉得这有点贵)? –

+0

您可以在有效负载部分保留用户角色和其他信息,然后您可以在验证令牌时了解他/她是否已通过身份验证。未经身份验证的用户不会拥有一个。 –

回答

3

TLDR:如果你想在某些时候撤消令牌的能力,是的,把它存储在像Redis那样快的东西里。

使用JWT的一个有据可查的缺点是,如果例如用户需要注销或令牌已被泄露,没有简单的方法来撤销令牌。撤销令牌意味着在某个存储中查找它,然后决定下一步该做什么。由于JWT的其中一点是避免往返数据库,所以一个好的折中办法是将它存储在比rdbms更少的税收上。对Redis来说这是一份完美的工作。

+0

谢谢,我采取了同样的方法。在这里,我使用redis来跟踪所有活动用户(使用标识对)。还要创建中间件来验证用户请求。这个中间件检查令牌是否有效并在redis中可用,只有满足这个条件,用户才能访问已认证的资源。 –

0

您可以使用Redis来存储jwt标签。 Redis更方便存储这些数据。对萝卜的要求不应该对性能产生很大影响。你可以试试这个库jwt-redis