【发布时间】:2015-05-08 14:12:26
【问题描述】:
JWT spec 提到了一个 jti 声明,据称该声明可用作防止重放攻击的随机数:
“jti”(JWT ID)声明为 JWT 提供了唯一标识符。标识符值的分配方式必须确保相同的值被意外分配给不同的数据对象的概率可以忽略不计;如果应用程序使用多个发行者,则必须防止不同发行者产生的值之间的冲突。 “jti”声明可用于防止 JWT 被重放。 “jti”值是区分大小写的字符串。使用此声明是可选的。
我的问题是,我将如何实现这一点?我是否需要存储以前使用的 jtis 并为每个请求发出一个新的 JWT?如果是这样,这不是违背了 JWT 的目的吗?为什么要使用 JWT 而不是仅将随机生成的会话 ID 存储在数据库中?
我的 REST API 有一个 Mongo 数据库,我不反对添加一个 Redis 实例。有比 JWT 更好的身份验证选项吗?我主要只是不想将密码存储在客户端上,这会消除 HTTP 身份验证作为选项,但是,随着我对 JWT 的深入了解,我开始觉得好像自定义令牌实现或不同的标准可能更适合我的需要。是否有任何 node/express 包用于基于令牌的身份验证,支持令牌撤销和轮换令牌?
不胜感激。
【问题讨论】:
-
您也可以两者兼得。使用 JWT 发送会话 ID 以及其他一些相对静态的数据,例如发布者、受众等。事实上,我们使用了一个连接中间件模块,它使用 JTI 来携带会话 ID,而这又是进入redis 哈希存储他们的实际会话。两者结合的方法允许您将 JWT 中的相对静态数据与 redis 中相对动态的会话数据分开,即使两者都需要与其会话相关联。
-
我想我会采取类似的方法,使用 mongo 存储有效令牌和 jwt 进行身份验证。当 jwt 过期时,客户端可以使用令牌请求新的 jwt。这种方法有什么陷阱吗?
标签: node.js rest express restful-authentication jwt