jwt的规范目前只检测jwt的发布者,过期时间,签名等信息.大部分现成的库都是按照标准写的.但是标准没有要求jwt带入登录时间等信息,因此用户连续登录多次,后台返回的token在有效期内都能访问后台api.也就是用户可以在多个设备同时登录.

有人会采用在登录时将jwt用redis等储存起来,在api的中间件检查时去查数据库中是否储存了这个token,设置过期时间.如果用户再次登录,那么将该token用新生成的token替代.

我们也可以不新建一个表,因为我们多数应用的用户表中都会储存用户的最后登录时间,最后登录ip等信息,我们可以在登录时将这些信息一边储存到数据库中,一边注入到jwt中.然后在用户访问api时在中间件中从中间件取出这些信息,和用户表中的信息进行对比,如果不符合,就不允许用户访问api.

 

 

 

初次尝试 JWT,发现一个账号生成多个 JWT token 后,只要在这些 token 还没过期前都是有效的

例如账号 A 在 15:30 分登录生成了 token0,有效时间为 1 小时,过了 5 分钟账号 A 再次登录生成了 token1 有效时间还是为 1 小时。 这时候 token0 和 token1 都是合法的? 我之前以为 token1 会把 token0 给刷新掉……


那么如何实现一个账号只能同时在一个设备(端)登录呢?想到了如下几种方式:

  • 1.将 token 存入 redis,每次登录就刷新 redis 里的 token,这样就能保证 token 永远只有一个(虽然实际上还是有多个,但是我只认 redis 里的这一个)。但是这样的话我就不需要 JWT 了啊,直接 redis 实现就好了
  • 2.结合 session,每次登录将 session 写入 token,然后判断当前 session 和 token 里的是否一致。同上面,这样是不是有点冗余了,直接用 session 实现就好了?
  • 3.将用户最后一次登录信息写入 token,判断 token 里的登录信息和数据库里最后一次的登录信息是否一致。这样做的话会频繁查询数据库,数据库负载会变高

各位大佬有什么好方法吗?