使用新的 Credential Manager API 通过 google 登录到 firebase

问题描述 投票:0回答:1

我正在通过使用 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,但这需要手动解析它。这似乎是错误的。难道真的没有内置方法吗?

android firebase firebase-authentication google-signin credential-manager
1个回答
0
投票

找到解析凭证响应的方法:

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()
© www.soinside.com 2019 - 2024. All rights reserved.