如何在Ktor中处理Refresh Token过期并跳转至登录页?
解决Ktor客户端Refresh Token过期时跳转登录页的问题
核心思路
在Ktor的Bearer认证配置中,通过自定义refreshTokens逻辑,捕获Refresh Token过期的异常(或判断后端返回的错误状态),触发登录页跳转操作。
具体实现步骤
扩展Bearer认证的refreshTokens逻辑
在install(BearerAuth)的配置块中,重写refreshTokens函数,除了处理正常的令牌刷新流程,还要检测Refresh Token失效的情况:install(BearerAuth) { refreshTokens { oldToken -> runCatching { // 调用后端的令牌刷新接口 val response = client.post("/auth/refresh") { setBody(RefreshTokenRequest(oldToken.refreshToken)) } // 后端返回401通常代表Refresh Token已过期或无效 if (response.status.value == 401) { throw RefreshTokenExpiredException() } // 解析并返回新的令牌对 val newTokens = response.body<TokenPair>() newTokens.accessToken to newTokens.refreshToken }.onFailure { e -> if (e is RefreshTokenExpiredException) { // 切换到主线程执行UI跳转(根据平台调整调度器) withContext(Dispatchers.Main) { // 替换为你的实际页面跳转逻辑,比如Android的Navigation、桌面端的路由API navController.navigate("login") } // 清理本地存储的过期令牌 clearStoredTokens() throw e } else { // 处理其他刷新失败的情况 throw e } }.getOrThrow() } }自定义异常标记Refresh Token过期
定义专属异常类,方便在逻辑中精准识别过期场景:class RefreshTokenExpiredException : Exception("Refresh token has expired")清理本地过期令牌
跳转登录页前,务必清理本地存储的旧令牌(如SharedPreferences、DataStore),避免后续重复使用无效凭证:// 示例:使用DataStore清理令牌 private fun clearStoredTokens() { runBlocking(Dispatchers.IO) { dataStore.edit { it[ACCESS_TOKEN_KEY] = null it[REFRESH_TOKEN_KEY] = null } } }
关键说明
- Ktor官方认证模块默认不会处理Refresh Token过期的场景,需要你在刷新逻辑中主动判断后端返回的错误状态码(常见为401)或捕获对应异常。
- 页面跳转属于UI操作,必须切换到主线程执行,不同平台的调度器或导航API需要自行适配。
内容的提问来源于stack exchange,提问作者padmalcom
相关产品推荐
相关产品推荐

