我正在使用 JWT 代币 为了休息api的安全。
当用户登录时,使用 DB 检查用户的凭据。
如果匹配,我们将对其进行加密以提高安全性,然后将其传递给 jwt 以创建 token
现在为了匹配用户的 token ,我们需要将密码保存在某处,以便在用户登录后发送任何请求时我们可以匹配它们
我们可以通过两种方式做到
1. 在数据库中保留详细信息,每次触发休息调用时,请使用数据库中的 token 检查 token ,这对于每次休息调用来说成本太高
2. 将 secret 保存在 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();
//向 session 添加详细信息
HttpSession httpSession = currentRequest.getSession();
httpSession.setAttribute("userSecret", password)
这适用于单个服务器实例。
但是在某些时候我们需要扩展并运行多个服务器实例。
我们如何处理这种情况,即用户可能使用 1 个实例登录,并且可能使用另一个实例使用负载平衡来服务休息调用。
由于用户 secret 仅在第一台服务器的 JVM 中可用。
最佳答案
您可以在服务器之间共享用于加密 JWT 的私钥。当服务器收到 API 调用时,您可以尝试使用 private key
解密 JWT。 .如果解密成功,您就有了一个有效的 JWT,您就可以处理请求了。如果解密失败,那就意味着它是一个无效的 JWT。创建 JWT 后,您无需访问数据库。在我看来,这是 JWT 的主要用途。
我不知道你说的 userSecret
是什么意思.
关于authentication - 用于在多个服务器实例上运行的分布式系统的 JWT token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47321252/