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))) |