如何更改 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) 。是的,这可行,而且我不认为我有多个线程,但这不会是内存泄漏,或者至少是内存浪费吗?
Auth
功能的引用并更改其提供者列表来做到这一点。以下是在创建客户端后更改基本身份验证凭据的示例:
val client = HttpClient(CIO) {
install(Auth) {
basic {
username = "user"
password = "password"
}
}
}
val auth = client.plugin(Auth)
if (auth != null) {
auth.providers.removeFirstOrNull()
auth.basic {
username = "new-user"
password = "new-password"
}
}
val r = client.get<String>("http://httpbin.org/basic-auth/new-user/new-password")
println(r)
const val REFRESH_TOKEN = "" // not required
val client = HttpClient(CIO) {
Auth {
bearer {
sendWithoutRequest { true }
loadTokens { BearerTokens(initialToken, REFRESH_TOKEN) }
}
}
}
fun updateBearerCredentials(newToken: String) {
client.plugin(Auth).bearer {
loadTokens { BearerTokens(newToken, REFRESH_TOKEN) }
}
}
我认为基本身份验证也同样有效。不过还没有测试过。