我正在尝试将JWT身份验证添加到我的vert.x应用程序中,这是我到目前为止所做的:
使用以下命令生成密钥库:
keytool -genseckey -keystore keystore.jceks -storetype jceks -storepass secret -keyalg HMacSHA256 -keysize 2048 -alias HS256 -keypass secret
建议使用here 然后在我的start方法中,我初始化了JWTAuth实例:
jwt = JWTAuth.create(vertx, new JsonObject()
.put("keyStore", new JsonObject()
.put("type", "jceks")
.put("path", "keystore.jceks")
.put("password", "secret")));
并添加了api route的处理程序:
router.route("/api/create_room")
.blockingHandler(JWTAuthHandler.create(jwt));
现在,当我在Authorization标头中发送带有一些Bearer令牌的请求时,我得到:
WARNING: JWT decode failure
java.lang.RuntimeException: Signature verification failed
我测试了令牌here,并说明签名已经过正确验证 我做错什么了吗 ?或者它是vert.x库中的错误?
UPD
private static final String DEFAULT_ALGORITHM = "HMACSHA256";
@Override
public synchronized byte[] sign(byte[] payload) {
SecretKey sk = new SecretKeySpec("secret".getBytes(), DEFAULT_ALGORITHM);
try {
mac.init(sk);
return mac.doFinal(payload);
} catch (GeneralSecurityException e) {
throw new RuntimeException(e);
}
}
显然,我已添加sk用于测试目的。我想在cryptoMap
初始化期间出现了问题。
答案 0 :(得分:0)
您看到的错误意味着根据site you linked解析令牌是正确的,但签名与令牌的内容不匹配。
您正在使用自定义签名初始化JWT,因此您只能验证自己发布的令牌。你是如何发行代币的?
换句话说,使用此模式只能验证自己创建的令牌。