Java使用nimbus-jose-jwt解析JWK提示缺少kty参数如何处理
问题原因与修复方案
根因分析
- Nimbus的
JWK类是内部封装的非POJO类,没有适配Jackson等通用JSON序列化框架的规则。Spring MVC默认用Jackson序列化JWK对象时,会反射输出所有内部私有字段,将kty等标准JWK字段嵌套在requiredParams属性中,keyUse、algorithm等字段也会序列化为包含内部属性的自定义对象,最终输出的JSON完全不符合RFC7517规定的标准JWK格式。 jwk.toString()输出格式正确,是因为Nimbus自己重写了该方法,内部按照JWK规范生成标准JSON结构,和通用序列化框架的逻辑无关。
最优修复方案
不需要自定义任何序列化/反序列化器,直接调用Nimbus JWK原生提供的toJSONString()方法输出标准JWK格式即可,全程使用包原生能力,客户端解析逻辑无需改动:
- 修改接口返回类型:
@RequestMapping(value = "/oauth2", produces = APPLICATION_JSON_VALUE) public interface Rest { @GetMapping("/public-key/{keyId}") @Operation(summary = "Return the public key corresponding to the key id") String getPublicKey(@PathVariable String keyId); }
- 调整实现类返回逻辑:
public String getPublicKey(String keyId) { byte[] publicKeyBytes = .... RSAPublicKey publicKey = (RSAPublicKey) keyFactory.generatePublic(new X509EncodedKeySpec(publicKeyBytes)); JWK jwk = new RSAKey.Builder(publicKey) .keyID(keyId) .algorithm(new Algorithm(publicKey.getAlgorithm())) .keyUse(KeyUse.SIGNATURE) .build(); // 直接返回Nimbus原生生成的标准JWK JSON字符串 return jwk.toJSONString(); }
如果担心String类型返回被Spring额外转义,可以改用ResponseEntity包装:
public ResponseEntity<String> getPublicKey(String keyId) { // JWK生成逻辑保持不变 return ResponseEntity.ok() .contentType(MediaType.APPLICATION_JSON) .body(jwk.toJSONString()); }
内容的提问来源于stack exchange,提问作者Bhushan
相关产品推荐
相关产品推荐

