问题描述
我正在使用jjwt Java库在servlet上生成jwt的服务器端,直接来自jjwt GitHub页面的代码片段生成并打印出此令牌。
I am using the jjwt Java library for server side generation of jwt in on servlets, the code snipper below straight from the jjwt GitHub page https://github.com/jwtk/jjwt generates and prints out this token.
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.XIKER3owR8BS3Krhsksg9INh9VBSejdn_qN-ONtPans
String compactJws = Jwts.builder()
.setSubject("Joe")
.signWith(SignatureAlgorithm.HS256, "secret")
.compact();
PrintWriter out = response.getWriter();
out.println(compactJws);
但是,当我尝试在jwt.io的调试器上验证此令牌时,它未通过签名检查。
However, when I try to verify this token on jwt.io's debugger, it fails the signature check.Both checking and unchecking secret base64 encoded didn't work
我错误地使用了这个库吗?
Am I using the library wrongly?
推荐答案
尝试使用 secr
并检查base64选项:)
Try with secr
and check the base64 option :)
这是由于 .signWith(SignatureAlgorithm.HS256,secret )
。它由 class
It is due to .signWith(SignatureAlgorithm.HS256, "secret")
. It is implemented by DefaultJwtBuilder class
public JwtBuilder signWith(SignatureAlgorithm alg, String base64EncodedSecretKey)
此方法假设您在base64中提供密钥而 秘密
不是base64 即可。当方法从 base64
解码为 byte []
时, jjwt 使用的java转换器提供字符串 secr
的表示形式,与 jwt.io
This method assumes that you are providing a key in base64 and secret
is not base64. When the method decodes from base64
to byte[]
the java converter used by jjwt provides a representation of the string secr
which is different to the JavaScript decoder used at jwt.io
您可以使用
System.out.println(
javax.xml.bind.DatatypeConverter.printBase64Binary(
javax.xml.bind.DatatypeConverter.parseBase64Binary("secret")));
这篇关于使用Java生成JJWT签名在jwt.io调试器中失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!