规则:我必须使用jwtdecoder实现。我们使用不同的jwt验证。主要是外部的。这是我们第一次进行内部jwt创建编码,然后通过验证进行解码。
private JwtDecoder sampleDecoder(String issuerUri, String jwkUri) {
OAuth2TokenValidator<Jwt> jwtValidator = JwtValidators.createDefaultWithIssuer(issueUri);
NimbusJwtDecoder jwtDecoder = NimbusJwtDecoder.withJwkSetUri(jwkUri).build();
jwtDecoder.setJwtValidator(jwtValidator);
return jwtDecoder;
}
所以以前,它是通过外部api登录的,它们给出一个令牌,然后根据请求,我们使用jwkseturi创建的jwtdecoder验证该令牌。
我现在的问题是我需要为我们的内部令牌创建一个jwtdecoder。我是这样做的。
public String createToken(String mobileNumber) throws JOSEException {
JWTClaimsSet jwtClaimsSet = new JWTClaimsSet.Builder()
.issuer(securityProperties.getConciergeIssuer())
.claim("mobileNumber", mobileNumber)
.claim("roles", "ADMIN")
.build();
ECKey ecKey = new ECKeyGenerator(Curve.P_256)
.keyID("123")
.generate();
JWSHeader jwsHeader = new JWSHeader.Builder(JWSAlgorithm.ES256)
.type(JOSEObjectType.JWT)
.keyID(ecKey.getKeyID())
.build();
SignedJWT jwt = new SignedJWT(jwsHeader, jwtClaimsSet);
jwt.sign(new ECDSASigner(ecKey.toECPrivateKey()));
String token = jwt.serialize();
return token;
}
至于它是 JwtDecoder
实施,我就是这样做的:
private JwtDecoder customDecoder(String issuer) {
OAuth2TokenValidator<Jwt> jwtValidator = JwtValidators.createDefaultWithIssuer(issuer);
byte[] decoded = Base64.getDecoder().decode(securityProperties.getConciergeSecret());
NimbusJwtDecoder jwtDecoder = NimbusJwtDecoder
.withSecretKey(new SecretKeySpec(decoded, 0, decoded.length, "AES"))
.build();
jwtDecoder.setJwtValidator(jwtValidator);
return jwtDecoder;
}
现在我知道这不合情理了。我不确定在令牌创建中在何处使用密钥,并且在创建解码器时遇到问题。有没有更合适的方法?
1条答案
按热度按时间velaa5lx1#
问题解决了。我基本上创建了我自己的jwtdecoder实现(实际上只是将jwtdecoder实现到我自己的类中),重写了
decode
方法,并自行实现了如何验证令牌(例如,获取声明和检查到期)