【问题标题】:Unable to successfully complete authentication无法成功完成身份验证
【发布时间】:2017-07-15 16:44:28
【问题描述】:

在下面的代码中,我试图打开一个登录页面。用户将填写电子邮件和密码。当用户点击登录按钮时,会调用checkLogin方法。

我了解在onComplete 方法中,第一个 if 块检查成功(填写电子邮件、密码和单击登录)没有被调用。我总是收到 Toast 消息“登录错误”(else 块)。

package com.awani.pocketblog;

import android.app.ProgressDialog;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

public class LoginActivity extends AppCompatActivity {

    private EditText mLoginEmailField;
    private EditText mLoginPasswordField;
    private Button mLoginButton;
    private Button mNewAccountButton;
    private FirebaseAuth mAuth;
    private ProgressDialog mProgress;

    private DatabaseReference mDatabaseUsers;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        mAuth = FirebaseAuth.getInstance();
        mDatabaseUsers = FirebaseDatabase.getInstance().getReference().child("Users");
        mDatabaseUsers.keepSynced(true);

        mLoginEmailField = (EditText) findViewById(R.id.loginEmailField);
        mLoginPasswordField = (EditText) findViewById(R.id.loginPaswordField);
        mLoginButton = (Button) findViewById(R.id.loginButton);
        mNewAccountButton = (Button) findViewById(R.id.newAccountButton);
        mProgress = new ProgressDialog(this);

        mLoginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                checkLogin();

            }
        });
    }

    private void checkLogin() {

        //retrieve the data from database to check if user is logged in correctly

        String email = mLoginEmailField.getText().toString().trim();
        String password = mLoginPasswordField.getText().toString().trim();

        if (!TextUtils.isEmpty(email) && !TextUtils.isEmpty(password)) {
            mProgress.setMessage("Checking Login...");
            mProgress.show();

            mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener < AuthResult > () {
                @Override
                public void onComplete(@NonNull Task < AuthResult > task) {
                    //the following if block is never executed....WHY?
                    if (task.isSuccessful()) {

                        //  Toast.makeText(LoginActivity.this,"hi",Toast.LENGTH_LONG).show();
                        checkUserExist();

                    } else {
                        mProgress.dismiss();
                        Toast.makeText(LoginActivity.this, "Error Login", Toast.LENGTH_LONG).show();
                    }
                }
            });

        }

    }

    private void checkUserExist() {

        //retrieving UID
        final String user_id = mAuth.getCurrentUser().getUid();
        //check if the user with thi UID already  exists
        mDatabaseUsers.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                if (dataSnapshot.hasChild(user_id)) {

                    Intent mainIntent = new Intent(LoginActivity.this, MainActivity.class);
                    mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(mainIntent);

                } else {
                    Intent setUpIntent = new Intent(LoginActivity.this, SetUpActivity.class);
                    setUpIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(setUpIntent);

                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }
}

【问题讨论】:

  • task.getException().getMessage() 添加到toast 以防止登录失败。此答案中列出了可能的失败原因:stackoverflow.com/a/39651068/4815718
  • @BobSnyder 我在代码行上方添加了您建议的行 Toast.makeText(LoginActivity.this,"Error Login",Toast.LENGTH_LONG).show();但它没有改变任何东西:(
  • toast 中的失败消息文本是什么?
  • @BobSnyder 感谢您的回答 :)。它说“E/MyActivity:登录失败:没有与此标识符对应的用户记录。用户可能已被删除。原来是在数据库中搜索用户。但是对于一个新用户,总是会出现这个错误...怎么办?

标签: java android firebase firebase-authentication


【解决方案1】:

对于使用电子邮件/密码的身份验证,必须首先使用createUserWithEmailAndPassword() 创建用户:

尝试使用给定的电子邮件地址创建一个新的用户帐户,并且 密码。如果成功,它还会让用户登录到应用程序

此示例在guide for password-based authentication 的第 4 步中提供:

mAuth.createUserWithEmailAndPassword(email, password)
        .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, "createUserWithEmail:success");
                    FirebaseUser user = mAuth.getCurrentUser();
                    updateUI(user);
                } else {
                    // If sign in fails, display a message to the user.
                    Log.w(TAG, "createUserWithEmail:failure", task.getException());
                    Toast.makeText(EmailPasswordActivity.this, "Authentication failed.",
                            Toast.LENGTH_SHORT).show();
                    updateUI(null);
                }

                // ...
            }
        });

【讨论】:

  • 谢谢,Bob!虽然有点困惑:getCurrentUser() 检查 auth 库中已经存在的用户,还是只考虑当前正在输入信息的用户?
  • @RamK: getCurrentUser() 返回当前登录的用户,如果没有则返回 null
【解决方案2】:

转到您的 Firebase 控制台,启用登录方法:Email/PasswordAnonymous

如果不起作用,请编辑您的密码,可能是太短了。

【讨论】:

    猜你喜欢
    • 2021-08-04
    • 2015-07-10
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多