【问题标题】:Authenticating android with google firebase authentication使用 google firebase 身份验证对 android 进行身份验证
【发布时间】:2017-03-11 22:16:42
【问题描述】:

我正在尝试使用 google 登录验证我的应用。

当我尝试这样做时,我得到 错误 Google Sign In failed. Status = Status{statusCode=DEVELOPER_ERROR, resolution=null}

我已经生成了一个 SHA1 密钥并在 FireBase 控制台上启用了 Google Auth。

我是 Android 身份验证方面的初学者。

public class RegisterActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener,
    View.OnClickListener {

private FirebaseAuth mFirebaseAuth;
private ProgressBar progressBar;
private ProgressDialog mProgressDialog;
private GoogleApiClient mGoogleApiClient;
private static final String TAG = "RegisterActivity";

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

    // Get FireBase mFirebaseAuth instance
    mFirebaseAuth = FirebaseAuth.getInstance();

    if (mFirebaseAuth.getCurrentUser() != null) {
        Log.e("45hh", "User logged in already...");
        startActivity(new Intent(RegisterActivity.this, MainActivity.class));
    }


    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestScopes(new Scope(Scopes.PLUS_LOGIN))
            .requestScopes(new Scope(Scopes.PLUS_ME))
            .requestEmail()
            .build();
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build();

    final EditText txtEmail = (EditText) findViewById(R.id.txtEmail);
    final EditText txtPassword = (EditText) findViewById(R.id.txtPassword);
    Button btnRegister = (Button) findViewById(R.id.btnRegister);
    Button btnGSignin = (Button) findViewById(R.id.btnGSignin);
    TextView txtAlreadyHaveAccount = (TextView) findViewById(R.id.txtAlreadyHaveAccount);
    progressBar = (ProgressBar) findViewById(R.id.progressBar);

    btnRegister.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String email = txtEmail.getText().toString().trim();
            String password = txtPassword.getText().toString().trim();

            if (TextUtils.isEmpty(email)) {
                Toast.makeText(getApplicationContext(), "Enter email address!", Toast.LENGTH_SHORT).show();
                return;
            } else if (TextUtils.isEmpty(password)) {
                Toast.makeText(getApplicationContext(), "Enter password!", Toast.LENGTH_SHORT).show();
                return;
            }

            if (password.length() < 6) {
                Toast.makeText(getApplicationContext(), "Password too short, enter minimum 6 characters!", Toast.LENGTH_SHORT).show();
                return;
            }

            progressBar.setVisibility(View.VISIBLE);
            // Create user
            mFirebaseAuth.createUserWithEmailAndPassword(email, password)
                    .addOnCompleteListener(RegisterActivity.this, new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            if (task.isSuccessful()) {
                                Toast.makeText(RegisterActivity.this, "Successfully registered!", Toast.LENGTH_SHORT).show();
                                progressBar.setVisibility(View.GONE);
                                startActivity(new Intent(RegisterActivity.this, MainActivity.class));
                                finish();
                            } else {
                                Toast.makeText(RegisterActivity.this, "Authentication failed. " + task.getResult(),
                                        Toast.LENGTH_SHORT).show();
                            }
                        }
                    });
        }
    });

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

    txtAlreadyHaveAccount.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(RegisterActivity.this, LoginActivity.class));
        }
    });
}

private void handleFirebaseAuthResult(AuthResult authResult) {
    if (authResult != null) {
        // Welcome the user
        FirebaseUser user = authResult.getUser();
        Toast.makeText(this, "Welcome " + user.getEmail(), Toast.LENGTH_SHORT).show();

        // Go back to the main activity
        startActivity(new Intent(this, MainActivity.class));
    }
}

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

@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 == 9001) {
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        if (result.isSuccess()) {
            // Google Sign In was successful, authenticate with Firebase
            GoogleSignInAccount account = result.getSignInAccount();
            firebaseAuthWithGoogle(account);
        } else {
            if(mProgressDialog!=null){
                hideProgressDialog();
            }
            // Google Sign In failed
            Log.e(TAG, "Google Sign In failed. Status = " + result.getStatus());
        }
    }
}

private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
    Log.d(TAG, "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(TAG, "signInWithCredential:onComplete:" + task.isSuccessful());

                    // If sign in fails, display a message to the user. If sign in succeeds
                    // the auth state listener will be notified and logic to handle the
                    // signed in user can be handled in the listener.
                    if (!task.isSuccessful()) {
                        Log.w(TAG, "signInWithCredential", task.getException());
                        Toast.makeText(RegisterActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(RegisterActivity.this, "Authentication Success. Please Wait",
                                Toast.LENGTH_SHORT).show();
                        startActivity(new Intent(RegisterActivity.this, MainActivity.class));
                        finish();
                    }
                    hideProgressDialog();
                }
            });
}

public void showProgressDialog() {
    if (mProgressDialog == null) {
        mProgressDialog = new ProgressDialog(this);
        mProgressDialog.setMessage("Loading...");
        mProgressDialog.setIndeterminate(true);
    }

    mProgressDialog.show();
}

public void hideProgressDialog() {
    if (mProgressDialog != null && mProgressDialog.isShowing()) {
        mProgressDialog.dismiss();
    }
}

@Override
public void onClick(View v) {

}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
    // An unresolvable error has occurred and Google APIs (including Sign-In) will not
    // be available.
    Log.d(TAG, "onConnectionFailed:" + connectionResult);
    Toast.makeText(this, "Google Play Services error.", Toast.LENGTH_SHORT).show();
}
}

【问题讨论】:

    标签: android firebase firebase-authentication google-signin


    【解决方案1】:

    这不起作用的原因是未指定 ClientID。应该这样做:

    private static final String googleClientID = "Enter-ClientID-Here";
    
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(googleClientID)
                .requestEmail()
                .build();
    

    您必须从这里获取您的客户 ID: (转到 FireBase 控制台 -> 身份验证 -> 登录方法 -> Google -> 点击 Web SDK 配置下拉菜单 -> Web 客户端 ID)

    P.S.确保向清单添加以下权限

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    

    希望这对某人有所帮助。

    【讨论】:

      【解决方案2】:

      只需按照以下步骤进行 Google 登录:

      1.) 在 Google Developers Console 中创建项目

      登录 Google Plus 帐户并点击创建项目。Creating google project

      2.) 根据您的选择填写详细信息,然后

      现在我们需要一个用于我们的 android 应用程序的配置文件。选择我们刚刚在开发者控制台上创建的应用程序。并写下你创建的 android studio 项目的包名。最后选择国家并点击继续。

      3.) 向 Cmd 输入此命令以查找 SHA1 密钥。

      对于窗户:

      keytool -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android
      

      对于 Linux:

      keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
      

      复制 SHA1 并将其粘贴到启用 Google 服务页面。

      现在点击启用 Google 登录。然后单击继续生成配置文件。现在单击下载 google-services.json 以获取您的配置文件。现在来android studio吧。

      复制 json 配置文件(您刚刚下载)并将其粘贴到您的 google login android studio 项目中(在 app/ 目录中)。 赞这个configuration file

      打开顶级 build.gradle 文件并在依赖项中添加以下行。

      classpath 'com.google.gms:google-services:1.5.0-beta2'
      

      在 build.gradle 文件中添加以下依赖项并同步您的 google 登录 android 项目。

      compile 'com.google.android.gms:play-services-auth:8.3.0'
          compile 'com.mcxiaoke.volley:library-aar:1.0.0' // this is for fetching the profile image of the user
      

      现在来到activity_main.xml。

      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:paddingBottom="@dimen/activity_vertical_margin"
          android:paddingLeft="@dimen/activity_horizontal_margin"
          android:paddingRight="@dimen/activity_horizontal_margin"
          android:paddingTop="@dimen/activity_vertical_margin">
      
          <com.google.android.gms.common.SignInButton
              android:id="@+id/sign_in_button"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_gravity="center_horizontal" />
      
          <com.android.volley.toolbox.NetworkImageView
              android:id="@+id/profileImage"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content" />
      
          <TextView
              android:text="Name"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content" />
      
          <TextView
              android:id="@+id/textViewName"
              android:textStyle="bold"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content" />
      
      
          <TextView
              android:text="email"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content" />
      
      
          <TextView
              android:id="@+id/textViewEmail"
              android:textStyle="bold"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content" />
      
      </LinearLayout>
      

      现在来到MainActivity.java,编写如下代码。

      import android.content.Intent;
      import android.support.v7.app.AppCompatActivity;
      import android.os.Bundle;
      import android.util.Log;
      import android.view.View;
      import android.widget.TextView;
      import android.widget.Toast;
      
      import com.android.volley.toolbox.ImageLoader;
      import com.android.volley.toolbox.NetworkImageView;
      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 org.w3c.dom.Text;
      
      public class MainActivity extends AppCompatActivity implements View.OnClickListener, GoogleApiClient.OnConnectionFailedListener {
      
          //Signin button
          private SignInButton signInButton;
      
          //Signing Options
          private GoogleSignInOptions gso;
      
          //google api client
          private GoogleApiClient mGoogleApiClient;
      
          //Signin constant to check the activity result
          private int RC_SIGN_IN = 100;
      
          //TextViews
          private TextView textViewName;
          private TextView textViewEmail;
          private NetworkImageView profilePhoto;
      
          //Image Loader
          private ImageLoader imageLoader;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              //Initializing Views
              textViewName = (TextView) findViewById(R.id.textViewName);
              textViewEmail = (TextView) findViewById(R.id.textViewEmail);
              profilePhoto = (NetworkImageView) findViewById(R.id.profileImage);
      
              //Initializing google signin option
              gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                      .requestEmail()
                      .build();
      
              //Initializing signinbutton
              signInButton = (SignInButton) findViewById(R.id.sign_in_button);
              signInButton.setSize(SignInButton.SIZE_WIDE);
              signInButton.setScopes(gso.getScopeArray());
      
              //Initializing google api client
              mGoogleApiClient = new GoogleApiClient.Builder(this)
                      .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
                      .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                      .build();
      
      
              //Setting onclick listener to signing button
              signInButton.setOnClickListener(this);
          }
      
      
          //This function will option signing intent
          private void signIn() {
              //Creating an intent
              Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
      
              //Starting intent for result
              startActivityForResult(signInIntent, RC_SIGN_IN);
          }
      
          @Override
          public void onActivityResult(int requestCode, int resultCode, Intent data) {
              super.onActivityResult(requestCode, resultCode, data);
              //If signin
              if (requestCode == RC_SIGN_IN) {
                  GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
                  //Calling a new function to handle signin
                  handleSignInResult(result);
              }
          }
      
      
          //After the signing we are calling this function
          private void handleSignInResult(GoogleSignInResult result) {
              //If the login succeed
              if (result.isSuccess()) {
                  //Getting google account
                  GoogleSignInAccount acct = result.getSignInAccount();
      
                  //Displaying name and email
                  textViewName.setText(acct.getDisplayName());
                  textViewEmail.setText(acct.getEmail());
      
                  //Initializing image loader
                  imageLoader = CustomVolleyRequest.getInstance(this.getApplicationContext())
                          .getImageLoader();
      
                  imageLoader.get(acct.getPhotoUrl().toString(),
                          ImageLoader.getImageListener(profilePhoto,
                                  R.mipmap.ic_launcher,
                                  R.mipmap.ic_launcher));
      
                  //Loading image
                  profilePhoto.setImageUrl(acct.getPhotoUrl().toString(), imageLoader);
      
              } else {
                  //If login fails
                  Toast.makeText(this, "Login Failed", Toast.LENGTH_LONG).show();
              }
          }
      
          @Override
          public void onClick(View v) {
              if (v == signInButton) {
                  //Calling signin
                  signIn();
              }
          }
      
          @Override
          public void onConnectionFailed(ConnectionResult connectionResult) {
      
          }
      }
      

      为了从 URL 加载图像,我使用了自定义排球请求。对于自定义排球请求,您必须创建以下类。

      import android.content.Context;
      import android.graphics.Bitmap;
      import android.support.v4.util.LruCache;
      
      import com.android.volley.Cache;
      import com.android.volley.Network;
      import com.android.volley.RequestQueue;
      import com.android.volley.toolbox.BasicNetwork;
      import com.android.volley.toolbox.DiskBasedCache;
      import com.android.volley.toolbox.HurlStack;
      import com.android.volley.toolbox.ImageLoader;
      
      
      public class CustomVolleyRequest {
      
          private static CustomVolleyRequest customVolleyRequest;
          private static Context context;
          private RequestQueue requestQueue;
          private ImageLoader imageLoader;
      
      
          private CustomVolleyRequest(Context context) {
              this.context = context;
              this.requestQueue = getRequestQueue();
      
              imageLoader = new ImageLoader(requestQueue,
                      new ImageLoader.ImageCache() {
                          private final LruCache<String, Bitmap>
                                  cache = new LruCache<String, Bitmap>(20);
      
                          @Override
                          public Bitmap getBitmap(String url) {
                              return cache.get(url);
                          }
      
                          @Override
                          public void putBitmap(String url, Bitmap bitmap) {
                              cache.put(url, bitmap);
                          }
                      });
          }
      
          public static synchronized CustomVolleyRequest getInstance(Context context) {
              if (customVolleyRequest == null) {
                  customVolleyRequest = new CustomVolleyRequest(context);
              }
              return customVolleyRequest;
          }
      
          public RequestQueue getRequestQueue() {
              if (requestQueue == null) {
                  Cache cache = new DiskBasedCache(context.getCacheDir(), 10 * 1024 * 1024);
                  Network network = new BasicNetwork(new HurlStack());
                  requestQueue = new RequestQueue(cache, network);
                  requestQueue.start();
              }
              return requestQueue;
          }
      
          public ImageLoader getImageLoader() {
              return imageLoader;
          }
      

      现在将互联网权限添加到您的清单并运行您的 google 登录 Android 应用程序。

      这就是G-SignIn认证的全部过程!!!

      【讨论】:

        猜你喜欢
        • 2018-10-19
        • 1970-01-01
        • 2016-09-26
        • 1970-01-01
        • 2021-02-08
        • 1970-01-01
        • 1970-01-01
        • 2017-11-08
        • 2017-11-27
        相关资源
        最近更新 更多