如何在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
相关产品推荐
相关产品推荐

