Как использовать открытый ключ для проверки токена JWT с помощью vertx - PullRequest
0 голосов
/ 02 июля 2018

Я использую Vertx с Kotlin и хочу аутентифицировать токен JWT.

У меня есть открытый ключ в файле веб-ключа Json от One Login.

{   "keys": [
{
  "kty": "RSA",
  "kid": "JRcO4nxs5jgc8YdN7I2hLO4V_ql1bdoiMXmcYgHm4Hs",
  "n": "z8fZsz...Something..GHSTAoQw",
  "e": "AQAB"
}   ] }

Как я могу использовать вышеупомянутый открытый ключ в файле Json Web Key для аутентификации, если токен 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 голосов
/ 05 июля 2018

Я нашел решение вышеуказанной проблемы. Итак, если у вас есть URL-адрес «certs», который возвращает файл веб-ключа Json, вы можете создать из него объект 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)))
...