JWT 登录 NodeJS 但无法在 Java 中验证

JWT Signing in NodeJS and but unable to verify in Java

我想将 JWT 令牌从 NodeJS 服务传递到 Java 中的另一个服务。但是,根据我的尝试,每当我尝试在 Java 端验证令牌时,令牌总是无效的。我知道 JWT 是独立于平台的,但我无法弄清楚为什么令牌无法在 Java 端得到验证。

错误:io.jsonwebtoken.security.SignatureException:JWT 签名与本地计算的签名不匹配。 JWT 有效性无法断言,不应被信任

NodeJS 签署令牌(使用 express-jwt 库)

    const jwtPayload = { id: "admin" };
    const secret = " ... some secret ...";
    const jwtData = { expiresIn: 2h };
    const access_token = jwt.sign(jwtPayload, secret, jwtData);

Java 验证令牌(使用 io.jsonwebtoken)

String secret = "...same as on the nodejs side"
String accessToken = " .. access_token from nodejs .. "
String username = Jwts.parserBuilder().setSigningKey(secret).build().parseClaimsJws(accessToken).getBody().getSubject();

我没有在 NodeJS 端或 Java 端设置任何其他选项。我是否缺少任何一个平台上的某些配置?或者我应该使用不同的库吗?

我认为问题出在字符串机密上。通过调用 getBytes("UTF-8") 你的秘密并向 signWith() 提供 byte[],一切都会成功。

String username = Jwts.parser()
                    .setSigningKey(secret.getBytes("UTF-8"))
                    .parseClaimsJws(accessToken)
                    .getBody()
                    .getSubject();

(还需要捕获UnsupportedEncodingException!)

在我的例子中,是这样解决的:

在 EXPRESS 中生成 JWT:

jwt.sign({ issuer: new Date(), roles, exp: Math.floor(Date.now() / 1000) + (43200) }, SECRET, {
      algorithm: 'HS256',
      subject: username,
      jwtid: jwtId,
    }, (err, token) => {
      if (err) {
        logger.error(util.inspect(err));
      }
      resolve({ token, jwtId });
    });

在 JAVA 我阅读使用 "SECRET".getBytes("UTF-8"):

Claims claims = Jwts.parser().setSigningKey("SECRET".getBytes("UTF-8")).parseClaimsJws(token).getBody();
            request.setAttribute("claims", claims);