KMM应用通用OAuth2认证方案咨询:能否在common模块实现?
KMM跨平台全局OAuth认证方案
可以在KMM的common模块实现全局OAuth认证逻辑,但要区分通用核心逻辑和平台依赖交互部分,无需完全为各原生平台单独实现整套方案。
关于Ktor oauth {}的问题
你提到的Ktor oauth {}是服务器端API,仅能在Application上下文调用,完全不适用KMM客户端场景,不要在common模块硬套该实现。
可行的common层实现思路
- 核心逻辑下沉common:将令牌管理、过期校验、刷新请求、API签名这类无平台依赖的逻辑封装在common模块,比如创建
AuthManager类统一处理。令牌存储可通过KMM的expect/actual机制实现平台化适配(Android用SharedPreferences,iOS用UserDefaults)。 - 平台交互抽象隔离:对于跳转授权页面、处理回调、调用系统浏览器这类必须依赖原生能力的操作,在common层定义抽象接口,各平台通过
actual关键字实现具体逻辑。
代码示例
common层核心代码
// 平台交互抽象接口 expect class AuthPlatformHandler { suspend fun launchAuthFlow(): AuthResult } // 全局认证管理类 class AuthManager( private val platformHandler: AuthPlatformHandler, private val apiClient: ApiClient ) { private var accessToken: String? = null private var refreshToken: String? = null suspend fun authenticate(): Result<String> = runCatching { if (isTokenValid()) { accessToken!! } else { val result = platformHandler.launchAuthFlow() accessToken = result.accessToken refreshToken = result.refreshToken accessToken!! } } private fun isTokenValid(): Boolean { // 实现令牌过期校验逻辑 return accessToken != null && /* 过期时间判断逻辑 */ true } suspend fun refreshToken(): Result<String> = runCatching { val newTokens = apiClient.refreshToken(refreshToken!!) accessToken = newTokens.accessToken refreshToken = newTokens.refreshToken accessToken!! } } data class AuthResult(val accessToken: String, val refreshToken: String)
Android层实现
actual class AuthPlatformHandler actual constructor() { actual suspend fun launchAuthFlow(): AuthResult { // 调用Android系统浏览器或WebView启动OAuth授权流程,处理回调获取令牌 return AuthResult("android-access-token", "android-refresh-token") } }
iOS层实现
actual class AuthPlatformHandler actual constructor() { actual suspend fun launchAuthFlow(): AuthResult { // 调用iOS的SFSafariViewController启动授权流程,处理回调 return AuthResult("ios-access-token", "ios-refresh-token") } }
额外方案
如果不想自行实现,也可选择维护状态良好的KMM OAuth封装库,但核心思路依然是通用逻辑抽离+平台能力抽象,避免重复造轮子。
内容的提问来源于stack exchange,提问作者basti394
相关产品推荐
相关产品推荐

