Как получить publi c ключи без блокировки - PullRequest
0 голосов
/ 18 июня 2020

Согласно документации, распознаватель ключей подписи может получить ключ динамически: https://github.com/jwtk/jjwt#signing -key-resolver

Следующий код вызывает функцию приостановки kotlin, которая извлекает publi c ключ неблокирующим способом:

val parser =
            Jwts.parserBuilder()
                .setSigningKeyResolver(object : SigningKeyResolverAdapter() {
                    override fun resolveSigningKey(header: JwsHeader<out JwsHeader<*>>, claims: Claims?): Key {
                        return runBlocking {
                            retrievePublicKey(header["kid"])
                        }
                    }
                }).build()
        val claims = parser.parseClaimsJws(jwtString).body

Вот определение функции приостановки

suspend fun retrievePublicKey(key:String):PublicKey {
...
}

Проблема в том, что этот код должен заблокировать поток (runBlocking). В противном случае это не сработает.

Эта проблема также существует для всех других асинхронных c фреймворков (rx java, listenablefuture, Completetablefuture, ...)

1 Ответ

1 голос
/ 18 июня 2020

Похоже, что библиотека jwtk в основном синхронна, поэтому невозможно напрямую использовать suspend, чтобы избежать блокировки.

Скорее вам следует обернуть библиотеку, чтобы вызовы parse* были сделано на диспетчере IO, который предназначен для обработки блокирующего ввода-вывода. Кроме того, если вы спроектируете свою функцию приостановки retrievePublicKey так, чтобы она полагалась на вызывающую программу для обработки потоковой передачи, вы можете заставить ее выполнять необходимую блокировку ввода-вывода в том же потоке, не потребляя дополнительных ресурсов.

val parser = /* create parser with runBlocking */
val claims = withContext(Dispatchers.IO) {
    // This will end up synchronously calling runBlocking, if the
    //  suspend function does not explicitly switch context it will do its work
    //  on the same thread.
    parser.parseClaimsJws(jwtString)
}.body

...