PassportJS + JWT - 正确的身份验证和授权?

时间:2018-04-05 07:26:05

标签: node.js authentication jwt passport.js passport-local

早上好/下午/晚上好!

最近为自己开了一个小项目,我想做的第一件事就是登录/身份验证以及访问不同路由/授权的权限。

我目前正在使用:

  • 的NodeJS
  • 快速
  • Passport(+ Passport Local and Passport JWT)
  • jsonwebtoken

我的服务器的目标是接收无状态身份验证/授权系统,因为我的目标是绕过“单线程” - 问题,并使用Node的群集模块为每个线程生成一个进程。

我已经通过JSON Web令牌完成了基本身份验证,目前我只在其中存储UserID,iad和失效日期。

现在我正在考虑添加角色以便在用户被允许进入某些路线时进行“简单”检查,但是我的问题已经开始了。 假设我将角色添加到令牌中,我可以轻松验证是否允许我使用Passport的JWTStrategy来访问该路由。 但是如果角色在发布令牌的时间内发生了变化,并且用户尝试访问路由的时间他没有更多的权限呢?截至目前,他可能仍然可以访问该路线,因为JWT收到(显然)没有角色的即时更新。 同样适用于被禁止/暂停的用户,他仍然可以正常使用该网站,直到令牌过期并且他需要请求新的。

直到现在,这反映了在用户信息登录后不再查询数据库的策略,因为JWT用于存储最关键的数据(虽然不是用户敏感数据)。

令牌无效可以通过存储在数据库中的JTI(令牌中的TokenID)轻松工作,一旦TokenID被称为“禁止”或任何东西,我就不会再让令牌进行身份验证了。但这会为每个API调用添加一个数据库调用...

对于角色/权限验证,我现在看到的方式是,我不会为每次API调用绕过一个数据库调用来检查用户权限。

我知道有像Node-ACL或CASL这样的解决方案,但是它们都是In-Memory我无法使用,因为我不想依赖Memory,因为我是Clustering,甚至Dockerizing我的应用程序,以及我不想“只”取决于Redis或MongoDB - 我希望我的应用程序在数据库方面非常灵活。

我也知道有像“刷新”和“访问”令牌这样的策略,其中刷新令牌是长寿命的并且Acecss-Token是短暂的(例如15分钟的到期日期) - 这是一个合适的策略? Ban / Suspension或RoleChange仍然不是即时的。我可以在数据库中保留刷新和访问令牌,并在该用户的关键数据发生变化时使访问令牌无效,并让CLient / Website弄清楚AccessToken已经消失并需要一个新的...但这似乎是对我来说是一个巨大的开销......

摘要

我正在使用JsonWebToken来验证用户。我的问题是我没有绕过用户API调用的数据库查询,因为我没有在JWT(用户禁止/暂停,角色)中始终更新关键信息。

在这种情况下,我最好做什么?

0 个答案:

没有答案