如何使用公共密钥通过vertx验证JWT令牌

时间:2018-07-02 02:59:24

标签: java kotlin jwt vert.x onelogin

我正在将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,太大。

1 个答案:

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