使用 google 登录创建 firebase 用户 .getCurrentUser() 返回 null

Posted

技术标签:

【中文标题】使用 google 登录创建 firebase 用户 .getCurrentUser() 返回 null【英文标题】:create firebase user with google login .getCurrentUser() returns null 【发布时间】:2019-03-15 19:13:49 【问题描述】:

简单问题:我想使用从

获得的凭证
        GoogleSignInOptions googleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .build();

private GoogleSignInAccount konto;
 private void handleSigninResult(GoogleSignInResult googleSignInResult) 
    if (googleSignInResult.isSuccess()) 
        konto = googleSignInResult.getSignInAccount();
    

后来我尝试使用 firebaseAuth 玩一点: 在 oncreate 方法中:

firebaseAuth = FirebaseAuth.getInstance();
    firebaseListener = new FirebaseAuth.AuthStateListener() 
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) 
            FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
            if (firebaseUser != null) 
                Log.d(TAG, "firebase user " + firebaseUser.getUid() + "    -   " + firebaseUser.getEmail());
             else 
                Log.d(TAG, "No firebase user ");
            
        
    ;

后来在 onStart 方法中我调用了这个方法:

 private void firebasewithGoogle(GoogleSignInAccount acc) 
    Log.d(TAG, "firebasewithGoogle  " + acc.getId());

    AuthCredential authCredential = GoogleAuthProvider.getCredential(acc.getIdToken(), null);

    firebaseAuth.signInWithCredential(authCredential)

            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() 

                @Override

                public void onComplete(@NonNull Task<AuthResult> task) 

                    if (task.isSuccessful()) 

                        // Sign in success, update UI with the signed-in user's information

                        Log.d(TAG, "signInWithCredential:success");

                        currentUser = firebaseAuth.getCurrentUser();


                     else 

                        // If sign in fails, display a message to the user.

                        Log.w(TAG, "signInWithCredential:failure", task.getException());

                        //Snackbar.make(findViewById(R.id.main_layout), "Authentication Failed.", Snackbar.LENGTH_SHORT).show();


                    


                

            );

永远不会调用“onComplete”方法,因为 firebase 用户身份验证数据库中没有用户。

使用 googleSignin 用户时如何创建用户? 对于电子邮件和 PW

firebaseAuth.createUserWithEmailAndPassword()

被使用。有没有办法对为谷歌提供者检索到的“.getIdToken()”做同样的事情? 或:

AuthCredential authCredential = GoogleAuthProvider.getCredential(acc.getIdToken(), null);

感谢任何提示。

编辑 1

我在示例中设置了一个精确的类:https://github.com/firebase/quickstart-android 用于 GoogleSignInActivity.java 一切正常,除了 firebase 的用户身份验证失败。 所以我猜 Firebase 控制台设置有问题。

Google 提供程序已启用 不需要电子邮件密码,因此已禁用 Web 客户端 ID(来自控制台)传递给 GoogleSignInOptions 的 .requestIdToken("")

有谁知道哪里出了问题?

编辑 2 任务:

.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() 
                @Override
                public void onComplete(@NonNull Task<AuthResult> task)

抛出:

com.google.firebase.FirebaseException: An internal error has occurred. [ Identity Toolkit API has not been used in project XXXXXXXX before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/identitytoolkit.googleapis.com/overview?project=XXXXXXXXXXXX then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry. ]

【问题讨论】:

firebase.google.com/docs/auth/android/manage-users 说您通过调用 createUserWithEmailAndPassword 方法或首次使用联合身份提供商(例如 Google Sign-In 或 Facebook)登录用户,在 Firebase 项目中创建一个新用户登录。但是我的用户没有创建 我已经在我的一篇教程中逐步解释了使用 GoogleFirebase 的整个身份验证过程。 谢谢你的评论,我会看看它。 我看了非常不错的教程,但是您没有在 firebase 控制台中包含身份验证设置?我认为您让所有用户都可以读取和写入数据库? 是的,我跳过了最简单的部分,即如何将 Firebase 添加到您的项目中。依赖项的版本也在不断变化。顺便说一句,我总是建议您使用最新版本。是的,它仅用于测试目的。 【参考方案1】:

所以,在 firebase 支持的帮助下,我把它整理出来了:

身份Toolkit API已启用之后我下载了 google-services.json 配置文件。

确认您在应用中使用的是最新的 google-services.json 配置文件,这一点非常重要。转到 Firebase 控制台中的“项目设置”并重新下载。将其放在应用目录内的应用文件夹中,然后重新编译您的应用。

【讨论】:

以上是关于使用 google 登录创建 firebase 用户 .getCurrentUser() 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

使用 google 登录创建 firebase 用户 .getCurrentUser() 返回 null

Firebase 使用 Google 帐户覆盖登录

在 React 中使用 Firebase 进行 Google 登录以进行 chrome 扩展

使用Firebase Google用户身份验证更改用户

Firebase Auth Ui Google 登录“开发者错误”

有没有办法确定用户是通过自定义 Firebase 帐户还是通过 Flutter 中的 Google 帐户登录的?