【问题标题】:JWT validation is failing : Key bytes cannot be specified for RSA signatures. Please specify a PublicKey or PrivateKey instanceJWT 验证失败:无法为 RSA 签名指定密钥字节。请指定 PublicKey 或 PrivateKey 实例
【发布时间】:2020-10-01 01:14:50
【问题描述】:

我正在尝试使用以下代码在我的服务中解码和验证 JWT 令牌:

String  jwtSecret= "my_key";
Claims claims = Jwts.parser()
        .setSigningKey(jwtSecret)
        .parseClaimsJws(jwt).getBody();
return claims;

上面的代码不起作用,抛出如下异常:

java.lang.IllegalArgumentException: Key bytes cannot be specified for RSA signatures.  Please specify a PublicKey or PrivateKey instance.

我也尝试过创建公钥,但没有成功。 谁能说明我缺少什么?

【问题讨论】:

  • 您的jwt 令牌是如何发行的?
  • 令牌由验证用户生成令牌的其他服务颁发。
  • 您的意思是令牌是通过另一个服务承载的。但最初颁发令牌的授权服务器是谁?
  • 是的。这是通过另一项服务。实际上我的服务是一个处理 websockets 所以在握手时我在路径参数中获取令牌并尝试验证令牌
  • 其他服务从哪里获取令牌?

标签: java jwt


【解决方案1】:

我使用的密钥不正确。 当我尝试使用我正在使用的密钥生成令牌并使用与上面相同的代码和相同的密钥进行解码时,我才知道,它起作用了。 所以我检查了处理 JWT 令牌生成的团队,我发现密钥不同。

【讨论】:

    【解决方案2】:

    看起来你是试图解码 JWT 的 JJWT。你从哪里得到公钥?

    与其将公钥作为字符串传递,不如先构建PublicKey,然后将其传递。如果您可以访问密钥的指数和模数:

    BigInteger modulus = new BigInteger(1, Base64.getUrlDecoder().decode(key.getN()));
    
    BigInteger exponent = new BigInteger(1, Base64.getUrlDecoder().decode(key.getE()));
    
    RSAPublicKeySpec publicSpec = new RSAPublicKeySpec(modulus, exponent);
    KeyFactory factory = KeyFactory.getInstance("RSA");
    return factory.generatePublic(publicSpec);
    

    如果您不这样做,this post 会解释如何从字符串构建它,但您必须确保字符串的格式正确。

    如果您有兴趣,这里有更多 detailed post that I wrote 介绍如何验证和解析授权服务器使用 JJWT 签名的 JWT。

    【讨论】:

      猜你喜欢
      • 2020-05-19
      • 2017-01-30
      • 2020-07-15
      • 2018-09-10
      • 2015-09-20
      • 1970-01-01
      • 2018-10-16
      • 1970-01-01
      • 2023-03-06
      相关资源
      最近更新 更多