前回はメールとパスワードの認証を行いました。
【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();
}
}
スクリーンショット
以上です。