在 KTor 客户端中更改身份验证凭据

Posted

技术标签:

【中文标题】在 KTor 客户端中更改身份验证凭据【英文标题】:Change auth credentials in KTor client 【发布时间】:2021-07-22 16:17:53 【问题描述】:

如何更改 KTor 客户端中的凭据?

在创建客户端时需要安装 Auth 功能。我稍后尝试过,但它似乎不起作用,无论是第一次设置还是重复。

文档建议在创建客户端后保留它,因为设置成本很高,因此无法更改凭据似乎过于严格(当然 JetBrains 的聪明人不会这样做)。

令我惊讶的是,我有一个有效的答案,但我不确定这是一个好的答案。欢迎评论。

因为文档说创建客户端很昂贵,所以我把它放在一个单例中,然后我做了这样的事情

@ThreadLocal
Object ServerLink 
    fun setClient(id:String, pw:String) 
        // Create the client here and set id and pw
    

然后,我只需随时调用 ServerLink.setClient(newId, newPW) 即可。是的,这行得通,而且我不认为我有多个线程,但这不会是内存泄漏,或者至少是内存浪费吗?

【问题讨论】:

【参考方案1】:

您可以通过获取对Auth 功能的引用并更改其提供者列表来实现。以下是创建客户端后更改基本身份验证凭据的示例:

val client = HttpClient(CIO) 
    install(Auth) 
        basic 
            username = "user"
            password = "password"
        
    


val auth = client.feature(Auth)
if (auth != null) 
    auth.providers.removeAt(0)
    auth.basic 
        username = "new-user"
        password = "new-password"
    


val r = client.get<String>("http://httpbin.org/basic-auth/new-user/new-password")
println(r)

【讨论】:

这看起来不错,但对我不起作用。我想知道是不是因为我的客户在 Kotlin 单例中。令我惊讶的是,我确实有答案,我已将其添加到问题中,但我不确定这是一个好答案。

以上是关于在 KTor 客户端中更改身份验证凭据的主要内容,如果未能解决你的问题,请参考以下文章

来自 UserHashedTableAuth 的 Ktor 基本身份验证

使用 Windows 身份验证在 Web API 控制器中获取 NetworkCredential 或客户端凭据

Ktor 中的表单身份验证

Android 中 Ktor 服务器身份验证的几个问题

Spring security 自定义身份验证提供程序总是导致错误的客户端凭据

AAD B2C 中具有客户端凭据授予流的 Azure 应用服务轻松身份验证