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

时间:2016-08-10 04:23:24

标签: java session redis jwt jedis

我正在使用 Java with Spring 来构建一个rest api以及其他一些服务。

主要功能是用户的创建/登录。我知道 redis 中没有查询语言,这就是我在这里发帖的原因!是否有某种Java库允许我们查询 Redis ?在我的情况下,获取分配给用户(userId)的所有当前 jwt 标记(会话)?

我想到了自己的实现,但我认为它有点过头而且笨重?

  1. 我使用 userId 作为密钥
  2. 然后我会在值部分中存储 JWT 标记。
  3. 实施例

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

      1. 创建JWT
      2. 使用userId
      3. 搜索现有的redis密钥
      4. 然后我们将找到的值投射到我们的初始 JWT 对象
      5. 然后我们将另一个 JWT 对象添加到hashmap
      6. 保存键+值
      7. 这意味着在每次请求受保护的api端点时,我必须按userId搜索,反序列化hashmap,循环遍历hashmap并尝试匹配标头中发送的JWT。这似乎很多工作?还有另一种方法吗?

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

        目前我只是将 JWT 标记存储为密钥并执行简单的 jedis.get(RequestHeader.JWT)< / em> 在受保护的api端点上。如果有一种方法可以查询值而不是密钥,那么这将是理想的,因为我可以将密钥存储为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.");
        

1 个答案:

答案 0 :(得分:2)

您可以按照以下步骤将JWT用于您的API:

  1. 用户登录 - &gt;创建JWT到期。
  2. 用户注销 - &gt;在Redis中保存无效令牌。
  3. 当用户致电api - &gt;你检查JWT:

    • 如果有效令牌而不是Redis无效的令牌=&gt;认证
    • 如果无效或属于Redis无效的令牌=&gt; unauthentication
  4. 如果您想获得登录用户,可以在用户登录时将登录用户存储在Redis中。