【发布时间】:2017-11-28 16:56:34
【问题描述】:
我正在尝试将 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 路由添加了处理程序:
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初始化时有问题。
【问题讨论】: