0

根据文档,签名密钥解析器可以动态获取密钥:https ://github.com/jwtk/jjwt#signing-key-resolver

以下代码确实调用了一个 kotlin 挂起函数,该函数以非阻塞方式检索公钥:

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)。否则无法正常工作。

这个挑战也存在于所有其他异步框架(rxjava、listenablefuture、completablefuture,...)

4

1 回答 1

1

貌似这个jwtk库大部分是同步的,所以不能直接使用suspend避免阻塞。

相反,您可能应该包装库,以便在旨在处理阻塞 IOparse*的调度程序上完成调用。IO此外,如果您将retrievePublicKey挂起函数设计为依赖调用者处理线程,则可以使其在同一线程中执行必要的阻塞 IO,而不会消耗更多资源。

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

于 2020-06-18T16:03:55.970 回答