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

如何在无WebView的Kotlin应用中使用ANDROID_CLIENT_ID获取Google登录ID Token及相关疑问

如何在无WebView的Kotlin应用中使用ANDROID_CLIENT_ID获取Google登录ID Token及相关疑问

嘿,我来帮你捋清楚这个Google登录的问题!

先解决你碰到的「[28444] Developer console is not set up correctly.」报错

这个错误99%都是Google开发者控制台的配置问题,哪怕你觉得自己配置对了,也得仔细核对这几点:

  • 确认你的ANDROID_CLIENT_ID对应的是Android类型的OAuth 2.0客户端,绝对不能是Web类型的(别和WEB_CLIENT_ID搞混)
  • 检查Android客户端的SHA-1指纹:不管你用的是debug还是release密钥库,对应环境的SHA-1必须准确填到控制台的Android客户端配置里——很多人会填错debug指纹或者漏填release指纹,这是重灾区
  • 应用的包名必须和控制台里Android客户端配置的包名完全一致,大小写、标点都不能错,差一个字符都不行
  • 最后再确认下「Google Sign-In API」已经在控制台里启用了(虽然WEB_CLIENT_ID能用的话大概率已经开了,但多检查一遍没坏处)

无WebView的Kotlin应用用ANDROID_CLIENT_ID获取ID Token的正确姿势

你提到用了GetGoogleIdOption.Builder(),应该是用的Google Identity Services的新SDK吧?给你整理一套适配原生Android的正确代码流程:

首先是基础配置和登录请求:

// 替换成你的Android类型客户端ID
const val YOUR_ANDROID_CLIENT_ID = "你的ANDROID_CLIENT_ID值"
const val RC_SIGN_IN = 1001

// 初始化GoogleSignInOptions,指定要获取ID Token
val googleSignInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
    .requestIdToken(YOUR_ANDROID_CLIENT_ID)
    .requestEmail() // 按需添加其他你需要的权限
    .build()

// 获取GoogleSignInClient实例
val googleSignInClient = GoogleSignIn.getClient(this, googleSignInOptions)

// 比如在登录按钮点击时发起请求
signInButton.setOnClickListener {
    val signInIntent = googleSignInClient.signInIntent
    startActivityForResult(signInIntent, RC_SIGN_IN)
}

如果用的是旧的startActivityForResult,可以这么处理登录结果:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == RC_SIGN_IN) {
        val task = GoogleSignIn.getSignedInAccountFromIntent(data)
        try {
            // 登录成功,拿到ID Token
            val account = task.getResult(ApiException::class.java)
            val idToken = account.idToken // 这就是你要的目标ID Token!
            // 接下来可以把idToken传给你的后端做验证
        } catch (e: ApiException) {
            Log.w("GoogleSignIn", "登录失败", e)
        }
    }
}

要是你用的是更推荐的Activity Result API(替代旧的startActivityForResult),代码会更简洁:

// 注册Activity Result回调
val signInLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val task = GoogleSignIn.getSignedInAccountFromIntent(result.data)
        try {
            val account = task.getResult(ApiException::class.java)
            val idToken = account.idToken
            // 处理拿到的ID Token
        } catch (e: ApiException) {
            Log.w("GoogleSignIn", "登录失败", e)
        }
    }
}

// 发起登录请求
signInButton.setOnClickListener {
    val signInIntent = googleSignInClient.signInIntent
    signInLauncher.launch(signInIntent)
}

再说说ANDROID_CLIENT_ID和WEB_CLIENT_ID的核心区别

  • ANDROID_CLIENT_ID:专门为Android原生应用设计,依赖设备上的Google Play Services完成登录验证,完全不需要WebView。它的安全性绑定在你的应用签名指纹和包名上,只有符合这两个条件的应用才能用这个客户端ID发起登录,安全性更高。
  • WEB_CLIENT_ID:是给Web应用或者需要WebView的场景用的,比如你的应用里有WebView加载的网页需要登录,或者你要模拟Web登录流程。它不校验Android应用的签名和包名,只要客户端ID有效就能发起登录——这就是为什么你用WEB_CLIENT_ID能成功,但这不是原生Android应用的最佳实践,甚至有安全隐患(比如其他应用拿到这个Web客户端ID也能发起登录)。

最后给你提个小建议

如果核对完控制台配置还是报错,可以试试删除控制台里的旧Android客户端,重新生成一个新的Android类型客户端ID,再把新的ID、正确的SHA-1和包名填进去,有时候缓存或者配置遗留问题会导致这种奇怪的报错。

备注:内容来源于stack exchange,提问作者jeyaprakash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 16:28:17