在 node.js 中生成的 JWT(JSON Web Token) 未在 java 中验证

Posted

技术标签:

【中文标题】在 node.js 中生成的 JWT(JSON Web Token) 未在 java 中验证【英文标题】:JWT(JSON Web Token) generated in node.js not validated in java 【发布时间】:2016-11-24 19:57:43 【问题描述】:

我正在使用带有require('jsonwebtoken') 的Node.js 生成JWT,使用的公钥是由Windows 中的puttygen 工具生成的。然后我将该令牌传递给标题中的其他应用程序。其他应用程序不是在 Node.js 中开发的。使用 java 我需要使用公钥验证令牌。但是我没有找到一个有效的样本来使用公钥/私钥进行验证。

谁能提供我如何在 java 中加载公钥/私钥并验证 jwt 令牌的步骤。如果您有任何示例,请提供给我。提前致谢。

示例公钥(public.pem):-

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "rsa-key-20160721"
AAAAB3NzaC1yc2EAAAABJQAAAQEAhk1i7Jwz2M6zakReDgg0Nk***1kK1R8qAp2p
Ayh0eUPCb2XICDDVRnpUIK7/4k4dlLeeSi10TwwXe85zZ0gXcNMIOpnEKIWcnqJM
ctbYwyrl2tAb/tKjvBCvHMA9ZnfNADkN6reBZq8u7kYJ3bF9PxvS3QM+vgJ8/8ZS
qkRWcsmRZdq+wthwGt43J3NSKFfhMVP08/V/hTASq06vvFYApHsEH6zLxNNQ63Tt
Bzedh+C5efyqYqEVqnA7S9bXimyY2ViqpqFTx1lM9dV+12dSOxd7CQzX8eo00Phi
EAnY2hfoTooUeCO3/L6YavRl+CXgjhvA9mg4QO554qI1YCUvBw==
---- END SSH2 PUBLIC KEY ----

节点JS代码:-

var privateKey = fs.readFileSync("public.pem");
var userData = username:'John';
var token = jwt.sign(userData, privateKey);

Java 代码:-

需要可以使用上述公钥验证上述令牌的java代码。

【问题讨论】:

您正在使用公钥签名,但代码提示 privateKey var privateKey = fs.readFileSync("public.pem"); 这是一个印刷错误吗? 实际上,在 Node JS 中,如果我们使用公钥签名,我们可以使用私钥进行验证,反之亦然。因此,即使我使用私钥签名,在 Java 方面我也无法理解如何使用公钥进行验证。如果您知道 Java 端验证,您能否提供我如何读取证书并验证令牌? 【参考方案1】:

加密操作独立于编程语言。你可以完美地在nodeJS中生成一个JWT并在Java中进行验证。

JWT 使用私钥进行数字签名,签名使用公钥进行验证。在 HMAC 对称密钥的情况下,签名和验证的密钥是相同的。

使用 Java 的 JWT 库,例如 https://github.com/jwtk/jjwt

 Jwts.parser().setSigningKey(key).parseClaimsJws(compactJws);

在页面中您可以看到支持的算法。

Putty 使用自己的密钥格式。 Java 不支持它。您需要将 Putty SSH2 密钥导出为 OpenSSH 格式。看 How can I read RSA keys in Java?

【讨论】:

以上是关于在 node.js 中生成的 JWT(JSON Web Token) 未在 java 中验证的主要内容,如果未能解决你的问题,请参考以下文章

如何使用/引用在同一个 json 模式中生成的字段值

带有 PHP 和 Angular.js 的 JWT(JSON Web 令牌)

Node.js身份认证,Cookie和Session的认证机制,express中使用session认证和JWT认证

JSON Web Tokens(JWT)

Json Web 令牌安全 [Node JS]

JSON Web Tokens(JWT)