关于Java:如何使用vertx使用公钥来验证JWT令牌

How to use public key to validate JWT Token using vertx

我正在将Vertx与Kotlin一起使用,并希望对JWT令牌进行身份验证。

我从One Login中获得了Json Web Key文件中的公共密钥。

1
2
3
4
5
6
7
{  "keys": [
{
 "kty":"RSA",
 "kid":"JRcO4nxs5jgc8YdN7I2hLO4V_ql1bdoiMXmcYgHm4Hs",
 "n":"z8fZsz...Something..GHSTAoQw",
 "e":"AQAB"
}   ] }

如何在Json Web密钥文件中使用上述公共密钥来验证JWT令牌是否有效?

我正在使用的类/方法是JWTAuth.create(vertx,config)

1
2
3
4
5
6
7
var config = JWTAuthOptions(
                pubSecKeys = listOf(PubSecKeyOptions(
                    algorithm ="RS256",
                    publicKey ="<Value Copied from above json's 'n' field>")))


  var provider = JWTAuth.create(myvertx, config)

以上行引发异常,说明
RuntimeException:java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException:IOException:DerInputStream.getLength():lengthTag = 71,太大。


我已经找到解决上述问题的方法。因此,如果您有一个\\'certs \\'URL返回Json Web Key文件,则可以从其中创建一个java.security.PublicKey对象,该对象可以与PubSecKeyOptions对象一起使用。

您需要读取键\\'n \\'和\\'e \\'的值,\\'n \\'被称为模数,\\'e \\'被称为指数。现在,您可以获取有效的JWTAuthOptions对象,如下所示;

1
2
3
4
5
6
7
8
9
10
val n = Base64.getUrlDecoder().decode(nValue.toByteArray(StandardCharsets.UTF_8))
val e = Base64.getUrlDecoder().decode(eValue.toByteArray(StandardCharsets.UTF_8))
val thePublicKeyINeeded: PublicKey= =KeyFactory.getInstance("RSA).generatePublic(RSAPublicKeySpec(n, e))        


val encodedBase64PublicKey:String = Base64.getEncoder().encodeToString(thePublicKeyINeeded.encoded)
    var config = JWTAuthOptions(
                pubSecKeys = listOf(PubSecKeyOptions(
                    algorithm ="
RS256",
                    publicKey = encodedBase64PublicKey)))