Android でパスワード ベースのアカウントを使用して Firebase 認証を行う

Firebase Authentication を使用することで、ユーザーが Firebase での認証にメールアドレスとパスワードを使用できるようにし、アプリのパスワード ベースのアカウントを管理できます。

準備

  1. Firebase を Android プロジェクトに追加します
  2. Firebase Authentication の依存関係をアプリレベルの build.gradle ファイルに追加します。
    compile 'com.google.firebase:firebase-auth:10.0.1'
  3. アプリを Firebase プロジェクトに接続していない場合は、Firebase console で接続します。
  4. メールとパスワードによるログインを有効にします。
    1. Firebase console で [認証] セクションを開きます。
    2. [ログイン方法] タブで [Email/password] を有効にして、[保存] をクリックします。

パスワード ベースのアカウントを作成する

パスワードを使用して新しいユーザー アカウントを作成するには、アプリのログイン アクティビティで次の手順に沿って操作します。

  1. 登録アクティビティの onCreate メソッドで、FirebaseAuth オブジェクトの共有インスタンスを取得します。
    private FirebaseAuth mAuth;
    // ...
    mAuth = FirebaseAuth.getInstance();
    
  2. ユーザーのログイン状態の変更に対応する AuthStateListener を設定します。
    private FirebaseAuth.AuthStateListener mAuthListener;
    
    // ...
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ...
        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null) {
                    // User is signed in
                    Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
                } else {
                    // User is signed out
                    Log.d(TAG, "onAuthStateChanged:signed_out");
                }
                // ...
            }
        };
        // ...
    }
    
    @Override
    public void onStart() {
        super.onStart();
        mAuth.addAuthStateListener(mAuthListener);
    }
    
    @Override
    public void onStop() {
        super.onStop();
        if (mAuthListener != null) {
            mAuth.removeAuthStateListener(mAuthListener);
        }
    }
    
  3. 新しいユーザーがアプリの登録フォームを使用して登録したら、アプリで必要な新しいアカウントの検証手順(新しいアカウントのパスワードが正しく入力されていることや、パスワードの複雑さの要件を満たしていることの確認など)を行います。
  4. 新しいユーザーのメールアドレスとパスワードを createUserWithEmailAndPassword に渡して、新しいアカウントを作成します。
    mAuth.createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    Log.d(TAG, "createUserWithEmail: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()) {
                        Toast.makeText(EmailPasswordActivity.this, R.string.auth_failed,
                                Toast.LENGTH_SHORT).show();
                    }
    
                    // ...
                }
            });
    
    新しいアカウントが作成され、ユーザーがログインすると、AuthStateListener によって onAuthStateChanged コールバックが実行されます。このコールバックでは、getCurrentUser メソッドを使用してユーザーのアカウント データを取得できます。

メールアドレスとパスワードを使用してユーザーのログインを行う

パスワードを使用したユーザーのログイン手順は、新しいアカウントの作成手順と似ています。アプリのログイン アクティビティで、次の手順に沿って操作します。

  1. ログイン アクティビティの onCreate メソッドで、FirebaseAuth オブジェクトの共有インスタンスを取得します。
    private FirebaseAuth mAuth;
    // ...
    mAuth = FirebaseAuth.getInstance();
    
  2. ユーザーのログイン状態の変更に対応する AuthStateListener を設定します。
    private FirebaseAuth.AuthStateListener mAuthListener;
    
    // ...
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ...
        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null) {
                    // User is signed in
                    Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
                } else {
                    // User is signed out
                    Log.d(TAG, "onAuthStateChanged:signed_out");
                }
                // ...
            }
        };
        // ...
    }
    
    @Override
    public void onStart() {
        super.onStart();
        mAuth.addAuthStateListener(mAuthListener);
    }
    
    @Override
    public void onStop() {
        super.onStop();
        if (mAuthListener != null) {
            mAuth.removeAuthStateListener(mAuthListener);
        }
    }
    
  3. ユーザーがアプリにログインしたら、そのユーザーのメールアドレスとパスワードを signInWithEmailAndPassword に渡します。
    mAuth.signInWithEmailAndPassword(email, password)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    Log.d(TAG, "signInWithEmail: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, "signInWithEmail:failed", task.getException());
                        Toast.makeText(EmailPasswordActivity.this, R.string.auth_failed,
                                Toast.LENGTH_SHORT).show();
                    }
    
                    // ...
                }
            });
    
    ログインが成功すると、AuthStateListener によって onAuthStateChanged コールバックが実行されます。コールバックでは、getCurrentUser メソッドを使用してユーザーのアカウント データを取得できます。

次のステップ

ユーザーが初めてログインすると新しいユーザー アカウントが作成され、ユーザーがログインに使用した認証情報(ユーザー名とパスワードや認証プロバイダ情報)にリンクされます。この新しいアカウントは Firebase プロジェクトの一部として保存され、ユーザーのログイン方法にかかわらず、プロジェクトのすべてのアプリでユーザーを識別するためにこれを使用できます。

  • アプリでは、FirebaseUser オブジェクトからユーザーの基本的なプロフィール情報を取得できます。ユーザーの管理についての記事をご覧ください。

  • Firebase Realtime Database と Firebase Storage のセキュリティ ルールで、ログイン済みユーザーに固有のユーザー ID を auth 変数から取得し、これを使用して、ユーザーがアクセスできるデータを制御できます。

既存のユーザー アカウントに認証プロバイダの認証情報をリンクすることで、ユーザーが複数の認証プロバイダを使用してアプリにログインできるようになります。

ユーザーのログアウトを行うには signOut を呼び出します。

FirebaseAuth.getInstance().signOut();

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。