Android

【Android】Firebase Googleログインの実装

前回はメールとパスワードの認証を行いました。
【Android】Firebaseでログイン認証する方法(メール/パスワード)

その続きでGoogleアカウントでログインする実装をしました。

説明

・FirebaseConsoleのログイン方法でGoogleを有効にします。

・プロジェクトのフィンガープリントを追加します。
情報取得方法は、下記記事に載せています。
【Android】SHA 証明書フィンガープリントの情報を取得する方法

・build.gradleに必要な情報を追加します。

compile 'com.google.firebase:firebase-auth:10.2.6'
compile 'com.google.android.gms:play-services-auth:10.2.6'

・Google認証に飛ばすためのコードです。

Intent signInIntent =
        Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, RESULT_GOOGLE_SIGN_IN);

・アカウントを選択した後の処理です。

GoogleSignInResult result =
      Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
    GoogleSignInAccount account = result.getSignInAccount();

    auth(account)
} else {
    Log.d(TAG, "ログインに失敗しました。");
}

・上記コードのauthの中身です。
ここでは、 GoogleAuthProvider.getCredentialで、
Firebaseのユーザー認証を行う証明書を取得します。
その後、signInWithCredentialのコールバックでログインができたか判定します。

private void auth(GoogleSignInAccount account) {
        AuthCredential credential =
              GoogleAuthProvider.getCredential(account.getIdToken(), null);
        Log.d(TAG, account.getEmail());
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener() {
                    @Override
                    public void onComplete(@NonNull Task task) {
                        if(task.getException() != null) {
                            Log.d(TAG, task.getException().getMessage());
                        }

                        if(task.isSuccessful()) {
                            // 次の画面へ遷移
                            Intent intent = 
                                 new Intent(LoginActivity.this, SecondActivity.class);
                            startActivity(intent);
                        } else {
                            Log.d(TAG, "ログインに失敗しました。");
                        }
                    }
                });
    }
サンプル

activity_login.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/new_user_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:text="ログイン画面"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/new_user_text_view"
        android:layout_marginTop="20dp">

        <Button
            android:id="@+id/login_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/password_edit_text"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="10dp"
            android:padding="20dp"
            android:background="@android:color/holo_red_dark"
            android:text="Gmailでログイン"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:textColor="@android:color/white"
            android:textStyle="bold" />

    </RelativeLayout>

</RelativeLayout>

LoginActivity.java

public class LoginActivity  extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener {

    private FirebaseAuth mAuth;
    private FirebaseAuth.AuthStateListener mAuthListener;

    private static final int RESULT_GOOGLE_SIGN_IN = 9001;
    private static final String TAG = "LoginActivity";

    private GoogleApiClient mGoogleApiClient;

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

        Button loginButton = (Button) findViewById(R.id.login_button);
        loginButton.setOnClickListener(onClickListener);

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

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this, this)
                .addApi(Auth.GOOGLE_SIGN_IN_API, googleSignInOptions)
                .build();

        mAuth = FirebaseAuth.getInstance();

        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null) {
                    // ログイン
                    Intent intent =
                           new Intent(LoginActivity.this, SecondActivity.class);
                    startActivity(intent);
                } else {
                    // ログイン失敗
                    Log.d(TAG, "ログインに失敗しました。");
                }
            }
        };
    }

    /**
     * クリックリスナー
     */
    private View.OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent signInIntent =
                    Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
            startActivityForResult(signInIntent, RESULT_GOOGLE_SIGN_IN);
        }
    };

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

    @Override
    protected void onStop() {
        super.onStop();
        if (mAuthListener != null) {
            mAuth.removeAuthStateListener(mAuthListener);
        }
    }

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

        if (requestCode == RESULT_GOOGLE_SIGN_IN) {
            GoogleSignInResult result =
                    Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            if (result.isSuccess()) {
                GoogleSignInAccount account = result.getSignInAccount();

                auth(account);
            } else {
                Log.d(TAG, "ログインに失敗しました。");
            }
        }
    }

    private void auth(GoogleSignInAccount account) {
        AuthCredential credential =
                GoogleAuthProvider.getCredential(account.getIdToken(), null);
        Log.d(TAG, account.getEmail());
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener() {
                    @Override
                    public void onComplete(@NonNull Task task) {
                        if(task.getException() != null) {
                            Log.d(TAG, task.getException().getMessage());
                        }

                        if(task.isSuccessful()) {
                            // 次の画面へ遷移
                            Intent intent =
                                    new Intent(LoginActivity.this, SecondActivity.class);
                            startActivity(intent);
                        } else {
                            Log.d(TAG, "ログインに失敗しました。");
                        }
                    }
                });
    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        Toast.makeText(this, "エラー", Toast.LENGTH_SHORT).show();
    }
}
スクリーンショット

以上です。




コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です