Firebase and new Google Sign-In on Android

后端 未结 2 871
死守一世寂寞
死守一世寂寞 2020-12-08 05:35

I\'m trying to add support for the new Google Sign-in announced as part of Play services 8.3.0. I successfully configured the project and I\'m getting a token from the Goog

相关标签:
2条回答
  • 2020-12-08 06:04

    It's a mix of the steps in Add Sign-In to Android and Authorizing with Google for REST APIs.

    Once you have a GoogleSignInResult you can get the account name from that and then request the token with the minimal scopes:

    @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);
            GoogleSignInAccount acct = result.getSignInAccount();
    
            String email = acct.getEmail();
    
            // TODO: run an async task to get an OAuth2 token for the account
        }
    }
    

    The async task will need to request these scopes:

    protected String doInBackground(String... params) {
        String scopes = "oauth2:profile email";
        String token = GoogleAuthUtil.getToken(getApplicationContext(), email, scopes);
        // exception handling removed for brevity
        return token;
    }
    

    Now you can use the token to sign in to Firebase as usual:

    ref.authWithOAuthToken("google", token, new Firebase.AuthResultHandler() {...
    
    0 讨论(0)
  • 2020-12-08 06:06

    Download source code from here (Firebase Google Login Android). In this blog I have provided the screenshot also for your help.

    activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:orientation="vertical">
    
    
            <ImageView
                android:layout_width="150dp"
                android:id="@+id/iv_image"
                android:src="@drawable/profileimage"
                android:layout_gravity="center"
                android:layout_height="150dp" />
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_marginTop="5dp"
                android:layout_height="40dp">
    
                <TextView
                    android:layout_width="100dp"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:layout_marginLeft="10dp"
                    android:text="Name"
                    android:textColor="#000000"
                    android:textSize="15dp" />
    
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:layout_marginLeft="10dp"
                    android:text="Name"
                    android:id="@+id/tv_name"
                    android:textColor="#000000"
                    android:textSize="15dp" />
    
            </LinearLayout>
    
            <View
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:background="#000000"></View>
    
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="40dp">
    
                <TextView
                    android:layout_width="100dp"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:layout_marginLeft="10dp"
                    android:text="Email"
                    android:textColor="#000000"
                    android:textSize="15dp" />
    
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:layout_marginLeft="10dp"
                    android:text="Email"
                    android:id="@+id/tv_email"
                    android:textColor="#000000"
                    android:textSize="15dp" />
    
            </LinearLayout>
    
            <View
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:background="#000000"></View>
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_alignParentBottom="true"
            android:layout_margin="10dp"
            android:background="#E02F2F"
            android:orientation="horizontal">
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/iv_google"
                android:src="@drawable/google_plus" />
    
            <TextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="center"
                android:id="@+id/tv_google"
                android:gravity="center_vertical"
                android:text="Sign in with Google"
                android:textColor="#FFFFFF"
                android:textSize="20dp" />
    
        </LinearLayout>
    </RelativeLayout>
    

    MainActivity.java

    package com.deepshikha.googlepluslogin;
    
    import android.app.ProgressDialog;
    import android.content.Intent;
    import android.support.annotation.NonNull;
    import android.support.v4.app.FragmentActivity;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.bumptech.glide.Glide;
    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.api.GoogleApiClient;
    import com.google.android.gms.common.api.ResultCallback;
    import com.google.android.gms.common.api.Status;
    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 MainActivity extends AppCompatActivity implements View.OnClickListener, GoogleApiClient.OnConnectionFailedListener {
    
        private static final int RC_SIGN_IN = 9001;
        private FirebaseAuth mAuth;
        private FirebaseAuth.AuthStateListener mAuthListener;
        private GoogleApiClient mGoogleApiClient;
        ImageView iv_google;
        ProgressDialog dialog;
        ImageView iv_image;
    
        boolean boolean_google;
        TextView tv_name, tv_email, tv_google;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            init();
            listener();
    
        }
    
        private void init() {
    
            tv_name = (TextView) findViewById(R.id.tv_name);
            tv_email = (TextView) findViewById(R.id.tv_email);
            tv_google = (TextView) findViewById(R.id.tv_google);
            iv_google = (ImageView) findViewById(R.id.iv_google);
            iv_image = (ImageView)findViewById(R.id.iv_image);
    
            dialog = new ProgressDialog(MainActivity.this);
            dialog.setMessage("Loading..");
            dialog.setTitle("Please Wait");
            dialog.setCancelable(false);
    
            mAuth = FirebaseAuth.getInstance();
            mAuthListener = new FirebaseAuth.AuthStateListener() {
                @Override
                public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                    FirebaseUser user = firebaseAuth.getCurrentUser();
                    if (user != null) {
                        // User is signed in
                        Log.d("LoginActivity", "onAuthStateChanged:signed_in:" + user.getUid());
                    } else {
                        // User is signed out
                        Log.d("LoginActivity", "onAuthStateChanged:signed_out");
                    }
                    // [START_EXCLUDE]
                    updateUI(user);
                    // [END_EXCLUDE]
                }
            };
    
    
            GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                    .requestIdToken(getString(R.string.default_web_client_id))
                    .requestEmail()
                    .build();
    
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .enableAutoManage(MainActivity.this /* FragmentActivity */, this /* OnConnectionFailedListener */)
                    .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                    .build();
        }
    
        private void listener() {
            iv_google.setOnClickListener(this);
            tv_google.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View view) {
    
            switch (view.getId()) {
                case R.id.iv_google:
                    break;
                case R.id.tv_google:
                    if (boolean_google){
                        signOut();
                        tv_name.setText("");
                        tv_email.setText("");
                        boolean_google=false;
                        Glide.with(MainActivity.this).load(R.drawable.profileimage).into(iv_image);
                    }else {
                        signIn();
                    }
                    break;
            }
    
        }
    
        @Override
        public void onStart() {
            super.onStart();
            mAuth.addAuthStateListener(mAuthListener);
        }
    
        @Override
        public void onStop() {
            super.onStop();
            if (mAuthListener != null) {
                mAuth.removeAuthStateListener(mAuthListener);
            }
        }
    
        @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 {
                    // Google Sign In failed, update UI appropriately
                    // [START_EXCLUDE]
                    updateUI(null);
                    // [END_EXCLUDE]
                }
            }
    
        }
    
        private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
            Log.d("LoginActivity", "firebaseAuthWithGoogle:" + acct.getId());
            // [START_EXCLUDE silent]
            try {
    
                dialog.show();
            } catch (Exception e) {
    
            }
            // [END_EXCLUDE]
    
            AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
            mAuth.signInWithCredential(credential)
                    .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            Log.d("LoginActivity", "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("LoginActivity", "signInWithCredential", task.getException());
                                Toast.makeText(MainActivity.this, "Authentication failed.",
                                        Toast.LENGTH_SHORT).show();
                            }
                            // [START_EXCLUDE]
    
                            try {
    
                                dialog.dismiss();
                            } catch (Exception e) {
    
                            }
                            // [END_EXCLUDE]
                        }
                    });
        }
    
        private void signIn() {
            Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
            startActivityForResult(signInIntent, RC_SIGN_IN);
        }
    
        private void signOut() {
            // Firebase sign out
            try {
                mAuth.signOut();
    
                // Google sign out
                Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
                        new ResultCallback<Status>() {
                            @Override
                            public void onResult(@NonNull Status status) {
                                updateUI(null);
                            }
                        });
            } catch (Exception e) {
    
            }
        }
    
        private void updateUI(FirebaseUser user) {
            try {
                dialog.dismiss();
            } catch (Exception e) {
    
            }
    
            if (user != null) {
                String str_emailgoogle = user.getEmail();
                Log.e("Email", str_emailgoogle);
                tv_email.setText(str_emailgoogle);
                tv_name.setText(user.getDisplayName());
                boolean_google=true;
                tv_google.setText("Sign out from Google");
    
                Glide.with(MainActivity.this).load( user.getPhotoUrl()).into(iv_image);
    
    
                Log.e("Profile", user.getPhotoUrl() + "");
    
            } else {
    
            }
        }
    
        @Override
        public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
            // An unresolvable error has occurred and Google APIs (including Sign-In) will not
            // be available.
            Log.d("LoginActivity", "onConnectionFailed:" + connectionResult);
            Toast.makeText(this, "Google Play Services error.", Toast.LENGTH_SHORT).show();
        }
    }
    
    0 讨论(0)
提交回复
热议问题