用于在多个服务器实例

时间:2017-11-16 03:47:03

标签: authentication jwt

我正在使用 JWT令牌来获取rest api的安全性。

当用户登录时,使用DB检查用户的凭据。

如果匹配,我们正在加密它以获得进一步的安全性,然后将其传递给jwt以创建令牌

现在为了匹配用户的令牌,我们需要在某处保留密码,以便我们可以在用户在登录后发送任何请求时匹配它们

我们可以通过2种方式做到这一点 1.在数据库中保留详细信息,每次触发休息呼叫时,使用数据库中的令牌检查令牌,这对于每次休息呼叫而言代价太高 2.在JVM中的某处保留秘密并使用它。在这里,我尝试了包

中的HttpSession

javax.servlet.http.HttpServletRequest

//我的密钥问题代码

// Encrypt it
    Key key = keyGenerator.generateKey(password);
    jwtToken = Jwts.builder()
            .setSubject(username)
            .setIssuer(uriInfo.getAbsolutePath().toString())
            .setIssuedAt(new Date())
            .setExpiration(toDate(LocalDateTime.now().plusMinutes(1)))
            .signWith(SignatureAlgorithm.HS512, key)
            .compact();

//向会话添加详细信息

HttpSession httpSession = currentRequest.getSession();
httpSession.setAttribute("userSecret", password)

这适用于单个服务器实例。

但是在某些时候我们需要扩展并运行多个服务器实例。

我们如何处理这种情况,即用户可以使用1个实例登录,并可以使用负载平衡使用其他实例提供休息呼叫。

由于用户密码仅在第一个服务器的JVM中可用。

1 个答案:

答案 0 :(得分:2)

您可以在服务器之间共享用于加密JWT的私钥。当服务器获得API调用时,您可以尝试使用Course解密JWT。如果解密成功,则您具有有效的JWT,并且您可以处理该请求。如果解密失败,则表示它是无效的JWT。创建JWT后,您无需访问数据库。在我看来,这是JWT的主要用途。 我不确定private key是什么意思。