authentication - 用于在多个服务器实例上运行的分布式系统的 JWT token

标签 authentication jwt

我正在使用 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/

相关文章:

token - JWT token 中 "kid"声明的含义是什么?

c# - 动态附加 OWIN JWT 资源服务器应用程序客户端(受众)

javascript - 使用 AJAX/jQuery 在网络摄像机上进行 HTTP 基本授权

kubernetes - 设置 Kubernetes 服务 token 的到期时间

python - 如何使用带有公钥的 python PyJWT 验证 JWT

node.js - 确认另一个系统上的用户

java - 从主体访问电子邮件 ID,其中身份验证在 Azure Active Directory 中完成

android - 社交登录在 Android 浏览器应用程序中不起作用

Laravel 代理作为客人

java - 如何在 Fedora 16 上通过守护进程登录 X Window