簡體   English   中英

Google登錄身份驗證失敗

[英]google sign in authentication failed

我想將Google登錄集成到我的應用中,但它沒有將我引向其他活動,它顯示了模擬器中唯一的身份驗證失敗,但是當我在真實設備上對其進行測試時,該應用停止了單擊Google登錄按鈕的操作。 這是我的下面的代碼

import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.google.android.gms.auth.api.Auth;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.auth.api.signin.GoogleSignInResult;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthCredential;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.GoogleAuthProvider;

public class googleact extends AppCompatActivity {

SignInButton button;
FirebaseAuth firebaseauth;
private final static int RC_SIGN_IN=2;
GoogleApiClient mGoogleApiClient;
FirebaseAuth.AuthStateListener mAuthListener;


@Override
protected void onStart() {
    super.onStart();
    firebaseauth.addAuthStateListener(mAuthListener);
}

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


    button =(SignInButton) findViewById(R.id.googlebtn);
   firebaseauth = FirebaseAuth.getInstance();

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            signIn();
        }
    });

    mAuthListener=new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            if (firebaseAuth.getCurrentUser() !=null){

                startActivity(new Intent(googleact.this, gprofile.class));
            }
        }
    };

    // Configure Google Sign In
    GoogleSignInOptions gso = new 
GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .build();


        // Build a GoogleApiClient with access to the Google Sign-In API and 
the
// options specified by gso.
        mGoogleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this /* FragmentActivity */, new 
    GoogleApiClient.OnConnectionFailedListener() {
                @Override
                public void onConnectionFailed(@NonNull ConnectionResult 
    connectionResult) {
                    Toast.makeText(googleact.this,"something went wrong", 
    Toast.LENGTH_SHORT).show();
                }
            })
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build();

}


// Configure Google Sign In
//GoogleSignInOptions gso = new 
GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
  //     .requestIdToken(getString(R.string.default_web_client_id))
      //  .requestEmail()
      //  .build();


private void signIn() {
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
    startActivityForResult(signInIntent, RC_SIGN_IN);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    // Result returned from launching the Intent from 
GoogleSignInApi.getSignInIntent(...);
    if (requestCode == RC_SIGN_IN) {
        GoogleSignInResult result = 
Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        if (result.isSuccess()) {
            // Google Sign In was successful, authenticate with Firebase
            GoogleSignInAccount account = result.getSignInAccount();
            firebaseAuthWithGoogle(account);
        } else {
            Toast.makeText(googleact.this,"AUTH WENT WRONG", 
Toast.LENGTH_SHORT).show();
        }
    }
}

    private void firebaseAuthWithGoogle(GoogleSignInAccount account) {
    AuthCredential credential = 
GoogleAuthProvider.getCredential(account.getIdToken(), null);
    firebaseauth.signInWithCredential(credential)
            .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");
                        FirebaseUser user = firebaseauth.getCurrentUser();
                       // updateUI(user);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w("TAG", "signInWithCredential:failure", 
 task.getException());
                        Toast.makeText(googleact.this, "Authentication 
failed.",
                                Toast.LENGTH_SHORT).show();
                       // updateUI(null);
                    }

                    // ...
                }
            });

    }
}

這是logcat 07-02 13:55:11.367 24547-24547 /? I / art:不是延遲啟用-Xcheck:jni(已啟用)07-02 13:55:11.367 24547-24547 /? W / art:使用默認值的X86的CPU意外變種:x86 07-02 13:55:11.793 24547-24547 / com.example.roomsarehere.foodishere W / System:ClassLoader引用的未知路徑:/data/app/com.example。 roomsarehere.foodishere-1 / lib / x86 07-02 13:55:12.086 24547-24571 / com.example.roomsarehere.foodishere I / DynamiteModule:考慮本地模塊com.google.android.gms.flags:2和遠程模塊com .google.android.gms.flags:0 07-02 13:55:12.086 24547-24571 / com.example.roomsarehere.foodishere I / DynamiteModule:com.google.android.gms.flags的選定本地版本07-02 13 :55:12.131 24547-24571 / com.example.roomsarehere.foodishere W /系統:引用的ClassLoader未知路徑:07-02 13:55:12.136 24547-24571 / com.example.roomsarehere.foodishere W /系統:引用未知的W / System路徑:/ system / priv-app / PrebuiltGmsCore / lib / x86 07-02 13:55:12.148 24547-24571 / com.example.roomsarehere.foodishere D / ApplicationLoaders:已忽略Vulkan層搜索路徑/ system / priv-app / PrebuiltGmsCore / lib / x86:/ system / 假libs:/system/priv-app/PrebuiltGmsCore/PrebuiltGmsCore.apk!/ lib / x86:/ system / lib:/ vendor / lib用於名稱空間0xa787a090 07-02 13:55:12.194 24547-24547 / com.example。 roomsarehere.foodishere I / FA:應用程序測量正在啟動,版本:11020 07-02 13:55:12.195 24547-24547 / com.example.roomsarehere.foodishere I / FA:要啟用調試日志記錄,請運行:adb shell setprop log。 tag.FA VERBOSE 07-​​02 13:55:12.222 24547-24571 / com.example.roomsarehere.foodishere W / DynamiteModule:找不到com.google.android.gms.crash的本地模塊描述符類。 07-02 13:55:12.265 24547-24547 / com.example.roomsarehere.foodishere V / FA:已啟用收藏

GoogleSignInOptions gso = new 
GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestIdToken(getString(R.string.default_web_client_id))
        .requestEmail()
        .build();

在onCreate()之外編寫此部分並運行代碼,然后在onCreate()中再次注釋前面的代碼並再次重寫相同的代碼,然后運行它可能會完成這項工作,我遇到了同樣的問題。

  1. 在Firebase控制台中啟用googleSignIn
  2. Android Studio中的LoginActivity.java-

     public class LoginActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener{ @BindView(R.id.sign_in_button) SignInButton signInButton; private FirebaseAuth mFirebaseAuth; private GoogleApiClient googleApiClient; private static int RC_SIGN_IN = 1; private DatabaseReference databaseReference; private ProgressDialog progressDialog; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); ButterKnife.bind(this); mFirebaseAuth = FirebaseAuth.getInstance(); databaseReference = FirebaseDatabase.getInstance().getReference().child("Users"); progressDialog = new ProgressDialog(this); GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestIdToken(getString( R.string.default_web_client_id)) .requestEmail() .build(); googleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this, this) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build(); signInButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient); startActivityForResult(signInIntent, RC_SIGN_IN); } }); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); progressDialog.setMessage("Signing in..."); progressDialog.show(); if (result.isSuccess()) { GoogleSignInAccount account = result.getSignInAccount(); firebaseAuthWithGoogle(account); } else { progressDialog.dismiss(); Log.e(LoginActivity.this.getClass().getSimpleName(), "Google Sign-In failed."); } } } private void firebaseAuthWithGoogle(GoogleSignInAccount acct) { Log.d(LoginActivity.this.getClass().getSimpleName(), "firebaseAuthWithGooogle:" + acct.getId()); AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); mFirebaseAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { Log.d(LoginActivity.this.getClass().getSimpleName(), "signInWithCredential:onComplete:" + task.isSuccessful()); if (!task.isSuccessful()) { Log.w(LoginActivity.this.getClass().getSimpleName(), "signInWithCredential", task.getException()); Toast.makeText(LoginActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show(); } else { progressDialog.dismiss(); checkUserExist(); } } }); } private void checkUserExist() { if(mFirebaseAuth.getCurrentUser() != null){ final String user_id = mFirebaseAuth.getCurrentUser().getUid(); databaseReference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if(dataSnapshot.hasChild(user_id)){ Intent signinIntent = new Intent(LoginActivity.this,SplashActivity.class); signinIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(signinIntent); } else{ Intent setupAccountIntent = new Intent(LoginActivity.this,SetupAccountActivity.class); setupAccountIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(setupAccountIntent); } } @Override public void onCancelled(DatabaseError databaseError) { } }); } } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { Toast.makeText(this, "Connection Failed", Toast.LENGTH_LONG).show(); } 

    }

因此,在此活動中,當用戶單擊google登錄按鈕時,它將在firebase控制台上進行身份驗證並轉到設置帳戶,用戶可以在該帳戶中設置其帳戶,就像您可以獲取用戶示例個人資料圖片等的詳細信息一樣。用戶,如果他已經設置了帳戶,那么它將進入啟動活動,即您的啟動器屏幕。 獲取用戶數據並將其保存在“用戶”節點中的數據庫中。

  1. SplashActivity.java-啟動器屏幕

     public class SplashActivity extends AppCompatActivity { @BindView(R.id.start) Button start; private FirebaseAuth mFirebaseAuth; private FirebaseUser mFirebaseUser; private FirebaseAuth.AuthStateListener mAuthListener; private GoogleApiClient googleApiClient; private DatabaseReference userDatabaseReference; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); ButterKnife.bind(this); mFirebaseAuth = FirebaseAuth.getInstance(); mFirebaseUser = mFirebaseAuth.getCurrentUser(); userDatabaseReference = FirebaseDatabase.getInstance().getReference().child("Users"); mAuthListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(FirebaseAuth firebaseAuth) { if (mFirebaseUser == null) { Intent loginIntent = new Intent(SplashActivity.this,LoginActivity.class); loginIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(loginIntent); } } }; GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestIdToken(getString(R.string.default_web_client_id)) .requestEmail() .build(); googleApiClient = new GoogleApiClient.Builder(this) .addApi(Auth.GOOGLE_SIGN_IN_API , gso) .build(); checkUserExist(); } private void checkUserExist() { if(mFirebaseAuth.getCurrentUser() != null){ final String user_id = mFirebaseAuth.getCurrentUser().getUid(); userDatabaseReference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if(!dataSnapshot.hasChild(user_id)){ Intent setupAccountIntent = new Intent(SplashActivity.this,SetupAccountActivity.class); setupAccountIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(setupAccountIntent); } } @Override public void onCancelled(DatabaseError databaseError) { } }); } } @Override public void onStart() { super.onStart(); googleApiClient.connect(); mFirebaseAuth.addAuthStateListener(mAuthListener); } @Override public void onStop() { if (mAuthListener != null) { mFirebaseAuth.removeAuthStateListener(mAuthListener); } googleApiClient.disconnect(); super.onStop(); } @OnClick(R.id.start) public void onViewClicked() { Intent intent = new Intent(this,MainActivity.class); startActivity(intent); finish(); } 

    }

因為這是我的啟動器活動,所以如果用戶未通過身份驗證就打開該應用程序,則它將登錄;如果未設置帳戶,則進入帳戶設置活動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM