Android使用Firebase登录Google

一、在 Firebase创建项目

如下图,点击位置,创建一个项目


二、创建好项目后,新增应用程序创建应用程序

1.我这里是Android,直接选中创建Android应用程序


image.png

2.填写相关数据


image.png

三、启用Google登录

image.png

image.png

三、登录流程官方文档

到这里就配置完成了,Android应用程序会生成一个google-services.json文件
1.导入sdk,查看sdk操作说明就行


image.png

2.登录代码片段

/**
     * google登录
     */
    private fun googleLogin(){
        val googleIdOption = GetGoogleIdOption.Builder()
            .setServerClientId(getString(R.string.default_web_client_id))
            .setFilterByAuthorizedAccounts(true)
            .build()
        val request = GetCredentialRequest.Builder()
            .addCredentialOption(googleIdOption)
            .build()

        lifecycleScope.launch {
            try {
                val result = credentialManager.getCredential(
                    context = this@LoginActivity,
                    request = request
                )
                handleSignIn(result.credential)
            } catch (e: GetCredentialException) {
                LogUtils.e("print", "Couldn't retrieve user's credentials: ${e.localizedMessage}")
            }
        }

    }

default_web_client_id这个是自动生成的

private fun handleSignIn(credential: Credential) {
        if (credential is CustomCredential && credential.type == TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
            val googleIdTokenCredential = GoogleIdTokenCredential.createFrom(credential.data)
            firebaseAuthWithGoogle(googleIdTokenCredential.idToken)
        } else {
            LogUtils.w("print", "Credential is not of type Google ID!")
        }
    }


     /**
     * 获取Google 登录token
     */
    private fun firebaseAuthWithGoogle(idToken: String) {
        val credential = GoogleAuthProvider.getCredential(idToken, null)
        auth.signInWithCredential(credential)
            .addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    val user = auth.currentUser
                    updateUI(user)
                } else {
                    updateUI(null)
                }
            }
    }

    /**
     * 更新ui
     */
    private fun updateUI(user: FirebaseUser?){
        if (user != null){
            val googleId = user.providerData.find {
                it.providerId == GoogleAuthProvider.PROVIDER_ID
            }?.uid
            otherLogin(googleId,user.email,LoginBean.TYPE_GOOGLE)
        }

    }

最后一步获取到firebaseUser,也就是用户数据,到这里算是完成了授权登录,后面的逻辑就是和自己的登录流程有关了

四、遇到的问题

按照官方的代码可能会出现以下错误
Couldn't retrieve user's credentials: During begin sign in, failure response from one tap: 16: [28433] Cannot find a matching credential.

1.可能原因SHA1配置的不正确,或者包名不匹配
2.上面代码中setFilterByAuthorizedAccounts(true)错误,设置了true: 仅允许 用户在当前应用的 OAuth 授权列表中的 Google 账户登录。这里我们应该设置为false

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。