我正在通过使用 Firebase 制作一个待办事项应用来学习 Kotlin/Compose。现在我正在尝试添加 Google 登录。起初,我一直在关注 YouTube 教程,但它使用的 API 结果已被弃用。我检查了官方 Firebase 文档,但它们也已经过时了。所以我正在尝试自己解决。
弃用消息表明我需要使用凭据管理器。到目前为止,我已经成功显示了 Google 对话框并收到了
GetCredentialResponse
。我想下一步是调用 Firebase.auth.signInWithCredential(<credentials>)
,但它需要一个 AuthCredential
对象,而我有一个完全不同的类型。似乎无法自己创建 AuthCredential
对象 - 初始化程序是包私有的。我该怎么办?
我的代码
val googleIdOption = GetGoogleIdOption.Builder()
.setAutoSelectEnabled(false)
.setFilterByAuthorizedAccounts(false)
.setServerClientId("...")
.build()
val request = GetCredentialRequest.Builder()
.addCredentialOption(googleIdOption)
.build()
val result = try {
credentialManager.getCredential(request = request, context = context)
} catch (e: Exception) {
e.printStackTrace()
if (e is kotlin.coroutines.cancellation.CancellationException) throw e
null
}
val user = Firebase.auth.signInWithCredential(???).await()
更新:我找到了
GoogleAuthProvider.getCredential()
方法,可以根据提供的 id 令牌创建 AuthCredential
。从技术上讲,我现在可以从响应包中提取 idToken,但这需要手动解析它。这似乎是错误的。难道真的没有内置方法吗?
找到解析凭证响应的方法:
GoogleIdTokenCredential.createFrom(result.credential.data)
。
完整代码:
val credential = result?.credential
val authCredential =
if (credential is CustomCredential && credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
val googleIdTokenCredential =
GoogleIdTokenCredential.createFrom(credential.data)
GoogleAuthProvider.getCredential(googleIdTokenCredential.idToken, null)
} else {
throw RuntimeException("Received an invalid credential type")
}
Firebase.auth.signInWithCredential(authCredential).await()