Java 我应该/可以如何将JWT令牌存储在redis中,以便查看当前的用户会话?

Java 我应该/可以如何将JWT令牌存储在redis中,以便查看当前的用户会话?,java,session,redis,jwt,jedis,Java,Session,Redis,Jwt,Jedis,我正在使用带有Spring的Java来构建RESTAPI以及一些其他服务 主要功能是创建/登录用户。我知道redis中没有查询语言,这就是为什么我在这里发布这个问题!Java中是否有某种库允许我们对Redis进行查询?在我的例子中,是否要获取分配给用户(userId)的所有当前jwt令牌(会话) 我想自己实现一个,但我觉得它有点过头和笨重 我会使用用户ID作为键 然后,我将JWT标记的hashmap存储在value部分中 范例 用户登录 我们创建了JWT 我们创建一个hashmap,然后添加JW

我正在使用带有Spring的Java来构建RESTAPI以及一些其他服务

主要功能是创建/登录用户。我知道redis中没有查询语言,这就是为什么我在这里发布这个问题!Java中是否有某种库允许我们对Redis进行查询?在我的例子中,是否要获取分配给用户(userId)的所有当前jwt令牌(会话)

我想自己实现一个,但我觉得它有点过头和笨重

  • 我会使用用户ID作为键
  • 然后,我将JWT标记的hashmap存储在value部分中
  • 范例

  • 用户登录
  • 我们创建了JWT
  • 我们创建一个hashmap,然后添加JWT
  • 然后,我们将hashmap作为字节数组分配给redis键(userId)
  • 我们将保存redis键+值
  • 如果同一个用户登录,我必须再次检查并执行以下操作:

  • 创建JWT
  • 使用用户ID搜索现有的redis密钥
  • 然后,我们将找到的值转换为初始的JWT对象
  • 然后,我们向hashmap添加另一个JWT对象
  • 保存键+值
  • 这意味着在对受保护的api端点的每个请求上,我必须按userId搜索、反序列化hashmap、循环hashmap并尝试匹配在头中发送的JWT。这似乎是一个很大的工作?还有别的办法吗

    如果用户想要注销,那么这个过程与再次登录非常相似,除了点4。,我会从hashmap中删除JWT,然后保存它

    目前,我只是将JWT令牌存储为密钥,并在受保护的api端点上执行一个简单的jedis.get(RequestHeader.JWT)。如果有一种查询值而不是键的方法,那么这将是理想的,因为我可以将键存储为JWT,将userId存储为值

    像这样:

    final String token = authHeader.substring(7); // The part after "Bearer "
     try {
          final Claims claims = Jwts.parser().setSigningKey("${secret}")
               .parseClaimsJws(token).getBody();
                request.setAttribute("claims", claims);
                request.setAttribute("token", token);
     } catch (final SignatureException e)  { throw new ServletException("Invalid token."); }
    
    if (redisClient.get(token) == null) throw new ServletException("Invalid or expired token.");
    

    您可以通过以下步骤为API使用
    JWT

  • 用户登录->使用expire创建JWT
  • 用户注销->在Redis中保存无效令牌
  • 当用户调用api->检查JWT时:

    • 如果有效令牌不在Redis中,则无效令牌=>身份验证
    • 如果不是无效或属于Redis,则无效令牌=>取消身份验证
  • 如果要获取登录用户,可以在用户登录时将登录用户存储在Redis中


  • 你打算在每个API中发送userId和JWT吗?是的@navaliger如果我没有误读你,保存所有无效的令牌,那就是浪费内存。通过在一定时间内使有效令牌和无效令牌过期(取决于用例和安全级别),使用该特性就足以控制有效令牌和无效令牌。