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

