Где получить открытый ключ для проверки токена JWT на Java или Kotlin - PullRequest
0 голосов
/ 28 июня 2018

Я использую Kotlin с Vertx на Бэкэнде, и интерфейс передает мне токен JWT после прохождения аутентификации из One Login. Теперь я хочу убедиться, что токен действителен, а не подделан. Если я перейду по следующей ссылке, это говорит о том, что мне нужен открытый ключ, чтобы иметь возможность создать объект JWTAuth, который я могу использовать для вызова аутентификации для проверки. https://vertx.io/docs/vertx-auth-jwt/kotlin/

Мне нужно знать, где я могу получить открытый ключ?

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Большое спасибо за слишком точный ответ. У меня есть доступ к веб-ключу JSON, и я также добавил его в JWTAuth.create, и теперь JWTCreate не выдает никаких исключений. Однако provider.authenticate всегда не может его аутентифицировать, даже если я использую аутентифицированный токен JWT, отправляемый из внешнего интерфейса.

Я использовал следующий способ для создания объекта JWTAuth.

       var jsonObject = JsonObject("<I Copied all contents of Json Web Key here.>")
       var provider = JWTAuth.create(myvertx, jsonObject)

Тогда я использовал

        var idJson = JsonObject()
        idJson.put("jwt", myJWTToken)

        var optionsJson = JsonObject()
        optionsJson.put("ignoreExpiration",true)

        idJson.put("options", optionsJson)

        provider.authenticate(idJson, { asyncresult ->
            println("Is authenticated = ${asyncresult.succeeded()}")

})

Но когда я попытался использовать Vertx способ предоставления открытого ключа с использованием PubSecKeyOptions и JWTAuthOptions, скопировав ключ из URL-адреса сертификатов OneLogin, он выдал исключение «InvalidKeyException»

Caused by: java.security.InvalidKeyException: IOException: DerInputStream.getLength(): lengthTag=71, too big.
at sun.security.x509.X509Key.decode(X509Key.java:398)
at sun.security.x509.X509Key.decode(X509Key.java:403)
at sun.security.rsa.RSAPublicKeyImpl.<init>(RSAPublicKeyImpl.java:86)
at sun.security.rsa.RSAKeyFactory.generatePublic(RSAKeyFactory.java:298)
at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:201)
... 51 more
0 голосов
/ 28 июня 2018

Я не знаю об OneLogin, но из их документации я вижу, что они являются провайдером SAML / OpenId Connect, поэтому открытый ключ можно легко получить из их конфигурации. В соответствии с их документами вы можете найти свой конфигурационный экземпляр:

https://<subdomain>.onelogin.com/oidc/.well-known/openid-configuration

Из этого файла вы должны найти ключ jwks_uri, который будет содержать значение вроде: https://acme.onelogin.com/oidc/certs. Если вы получите этот URL, у вас будет JSON, похожий на этот:

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

Этот файл представляет собой веб-ключ JSON (цепочка). Этот JSON может быть передан в JWTAuth для загрузки ключа и выполнения необходимой проверки. Как примечание для 3.6 Будет правильная поддержка OpenId Connect Discovery в модуле OAuth2, что означает, что вам больше не нужно возиться с этим и просто передавать URL, если ваш поставщик и все будет правильно настроено.

...