我正在将Vertx与Kotlin一起使用,并希望验证JWT令牌。
我从One Login的Json Web Key文件中拥有公共密钥。
{ "keys": [
{
"kty": "RSA",
"kid": "JRcO4nxs5jgc8YdN7I2hLO4V_ql1bdoiMXmcYgHm4Hs",
"n": "z8fZsz...Something..GHSTAoQw",
"e": "AQAB"
} ] }
如何使用Json Web密钥文件中的上述公共密钥来验证JWT令牌是否有效?
我正在使用的类/方法是JWTAuth.create(vertx,config)
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,太大。
答案 0 :(得分:0)
我已经找到解决上述问题的方法。因此,如果您有一个返回“ Json Web密钥”文件的“证书” URL,则可以在其中创建一个java.security.PublicKey对象,该对象可以与PubSecKeyOptions对象一起使用。
您需要读取键'n'和'e'的值,其中'n'被称为模数,而'e'被称为指数。现在,您可以按以下方式获取有效的JWTAuthOptions对象;
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)))