MyT*_*nts 2 authentication jwt
我正在使用JWT令牌来实现Rest API的安全性。
登录用户后,使用DB检查用户的凭据。
如果匹配,我们将对其加密以进一步提高安全性,然后将其传递给jwt以创建令牌
现在,为了匹配用户的令牌,我们需要将密码保留在某处,以便我们可以在用户登录后发送任何请求时匹配它们。
我们可以通过2种方式做到这一点:1.在数据库中保存详细信息,每次触发rest调用时,都要检查Database中带有Token的令牌,这对于每个rest调用来说都太昂贵了。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();
Run Code Online (Sandbox Code Playgroud)
//向会话添加详细信息
HttpSession httpSession = currentRequest.getSession();
httpSession.setAttribute("userSecret", password)
Run Code Online (Sandbox Code Playgroud)
这对于单个Server实例运行正常。
但是在某些时候,我们需要扩展并运行多个服务器实例。
如果用户可能使用1个实例登录并且可能使用负载平衡使用另一个实例为rest呼叫提供服务,我们将如何处理这种情况。
由于用户机密仅在第一台服务器的JVM中可用。
您可以在服务器之间共享用于加密JWT的私钥。服务器收到API调用后,您可以尝试使用解密JWT private key。如果解密成功,则您具有有效的JWT,并且可以处理请求。如果解密失败,则意味着它是无效的JWT。创建JWT后,您无需访问数据库。我认为这是JWT的主要用法。我不确定你的意思userSecret。