Kotlin Jetpack集成Firebase Authentication谷歌登录时,无法获取googleIdToken且存在未解析引用问题
Kotlin Jetpack集成Firebase Authentication谷歌登录时,无法获取googleIdToken且存在未解析引用问题
兄弟,我刚看完你的问题,咱们一步步来解决谷歌登录拿不到googleIdToken的问题,还有你代码里可能存在的未解析引用情况~
首先得说,你选Credential Manager是对的,旧的GoogleSignInClient确实已经被官方弃用了,现在这套新的方式是主流。不过看你贴的代码只写了开头,咱们先把完整流程理清楚,顺便把容易踩的坑给你指出来:
1. 先把依赖补全,解决未解析引用
如果你的代码里有红标提示未解析的类(比如GetGoogleIdOption、GoogleIdTokenCredential),大概率是依赖没加全。打开你app模块的build.gradle.kts(或者build.gradle),把这些依赖加上:
// Credential Manager核心依赖 implementation "androidx.credentials:credentials:1.2.2" implementation "androidx.credentials:credentials-play-services-auth:1.2.2" // Firebase Auth依赖 implementation "com.google.firebase:firebase-auth-ktx:22.3.1" // 协程和生命周期依赖(用来处理异步请求) implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.7.0"
加完后同步一下项目,再导入对应的包:
import androidx.credentials.GetCredentialRequest import androidx.credentials.GetCredentialException import androidx.credentials.credentials.GetGoogleIdOption import androidx.credentials.credentials.GoogleIdTokenCredential import com.google.firebase.auth.FirebaseAuth import com.google.firebase.auth.GoogleAuthProvider import kotlinx.coroutines.launch
2. 完整的谷歌登录代码实现
把你没写完的代码补全,重点是正确配置Web客户端ID(这是拿不到googleIdToken的核心坑):
Row(horizontalArrangement = Arrangement.Center) { val context = LocalContext.current val credentialManager = CredentialManager.create(context) // 这里要填Firebase控制台里的【Web客户端ID】,不是Android应用的客户端ID! val webClientId = "你的Firebase项目Web客户端ID" Button(onClick = { lifecycleScope.launch { try { // 配置谷歌登录请求参数 val googleIdOption = GetGoogleIdOption.Builder() .setFilterByAuthorizedAccounts(false) // false显示所有谷歌账号,true只显示已授权的 .setServerClientId(webClientId) .build() val request = GetCredentialRequest.Builder() .addCredentialOption(googleIdOption) .build() // 发起凭证请求 val result = credentialManager.getCredential(context, request) // 解析返回的凭证 when (val credential = result.credential) { is GoogleIdTokenCredential -> { // 终于拿到googleIdToken了! val googleIdToken = credential.idToken Log.d("GoogleSignIn", "拿到的IdToken:$googleIdToken") // 接下来传给Firebase Auth做验证登录 val firebaseCredential = GoogleAuthProvider.getCredential(googleIdToken, null) FirebaseAuth.getInstance().signInWithCredential(firebaseCredential) .addOnCompleteListener { task -> if (task.isSuccessful) { // 登录成功,处理用户信息 val user = FirebaseAuth.getInstance().currentUser Log.d("GoogleSignIn", "登录成功,用户名:${user?.displayName}") } else { // 登录失败,打印错误信息 Log.e("GoogleSignIn", "登录失败:${task.exception?.message}") } } } else -> { Log.d("GoogleSignIn", "获取到的不是谷歌凭证,忽略") } } } catch (e: GetCredentialException) { // 处理请求失败的情况,比如用户取消登录 Log.e("GoogleSignIn", "请求凭证失败:${e.message}") } } }) { Text(text = "谷歌登录") } }
3. 最容易踩的坑(划重点!)
- Web客户端ID填错:一定要去Firebase控制台,进入「Authentication」→「登录方法」→「谷歌」,找到「Web SDK配置」里的客户端ID,不是Android应用的客户端ID!填错的话肯定拿不到
googleIdToken。 - SHA-1指纹未配置:在Firebase控制台的「项目设置」→「应用」里,把你应用的SHA-1指纹加上,不然Firebase会拒绝验证请求。
- 网络权限:确保
AndroidManifest.xml里加了网络权限:<uses-permission android:name="android.permission.INTERNET" />
按照上面的步骤来,应该就能解决拿不到googleIdToken和未解析引用的问题了,如果还有问题可以再检查下Firebase的配置有没有遗漏~
备注:内容来源于stack exchange,提问作者Ajay Satpati
相关产品推荐
相关产品推荐

