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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:22:37