You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android端Ktor client中清除Bearer令牌

Ktor Client 1.6.4 版本实现登出清空令牌的操作方案

核心逻辑说明

io.ktor:ktor-client-auth:1.6.4的Bearer认证插件本身不负责令牌的持久化存储,你配置时的令牌读取、刷新逻辑都是依赖你自行维护的本地存储实现,所以登出操作只需完成两步即可:


步骤1:清空本地持久化存储的令牌

你当初配置Bearer认证时的代码逻辑大致如下,其中loadTokens回调里读取的就是你存在本地(SharedPreferences、DataStore等)的令牌:

install(Auth) {
    bearer {
        loadTokens {
            // 你自定义的读取本地令牌逻辑
            BearerTokens(
                accessToken = localStorage.getAccessToken(),
                refreshToken = localStorage.getRefreshToken()
            )
        }
        refreshTokens {
            // 你自定义的刷新令牌逻辑
        }
    }
}

登出时首先要把本地存储的accessToken和refreshToken全部清空,比如用SharedPreferences的实现如下:

// 清空本地存储的令牌
sharedPreferences.edit()
    .remove(KEY_ACCESS_TOKEN)
    .remove(KEY_REFRESH_TOKEN)
    .apply()

步骤2:清空Bearer插件的内存缓存(建议执行)

1.6.x版本的Bearer插件会在内存中缓存最近一次加载的令牌,避免每次请求都重复读取本地存储,所以仅清空本地存储可能会出现内存中还残留旧令牌的问题,有两种解决方式:

  • 方式一:直接释放当前使用的Ktor Client实例,后续发起请求时重新初始化新的Client实例,适合Client为懒加载的场景
  • 方式二:配置Bearer时提前保存BearerAuthProvider实例,登出时调用内置方法清空缓存,示例代码如下:
// 全局声明BearerAuthProvider变量
lateinit var bearerAuthProvider: BearerAuthProvider

// 初始化Client时保存实例
val httpClient = HttpClient(OkHttp) {
    install(Auth) {
        bearer {
            bearerAuthProvider = this
            // 原有配置逻辑保持不变
            loadTokens { /*原有逻辑*/ }
            refreshTokens { /*原有逻辑*/ }
        }
    }
}

// 登出时调用清空缓存
fun logout() {
    // 先清空本地存储
    sharedPreferences.edit()
        .remove(KEY_ACCESS_TOKEN)
        .remove(KEY_REFRESH_TOKEN)
        .apply()
    // 清空内存缓存的令牌
    bearerAuthProvider.clearToken()
    // 后续执行跳转登录页等业务逻辑
}

内容的提问来源于stack exchange,提问作者JaySH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:36:04