Android で Firebase 匿名認証を行う

Firebase で認証する一時的な匿名アカウントを、Firebase Authentication で作成して使用できます。一時的な匿名アカウントを使用すると、アプリに登録していないユーザーが、セキュリティ ルールで保護されているデータを使用できるようになります。匿名ユーザーのアプリへの登録では、ログイン認証情報を匿名アカウントにリンクして、以後のセッションでも引き続き、保護されているデータを使用可能にできます。

準備

  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. [ログイン方法] ページで [Anonymous] を有効にします。

Firebase 匿名認証を行う

ログアウトしたユーザーが Firebase での認証を必要とするアプリ機能を使用している場合は、次の手順に沿って匿名でのユーザーのログインを行います。

  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. 最後に、signInAnonymously を呼び出して匿名ユーザーとしてログインします。
    mAuth.signInAnonymously()
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    Log.d(TAG, "signInAnonymously: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, "signInAnonymously", task.getException());
                        Toast.makeText(AnonymousAuthActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                    }
    
                    // ...
                }
            });
    
    ログインが成功すると、AuthStateListener によって onAuthStateChanged コールバックが実行されます。このコールバックでは、getCurrentUser メソッドを使用してユーザーのアカウント データを取得できます。

匿名アカウントを永久アカウントに変換する

匿名ユーザーのアプリへの登録では、新しいアカウントによる作業の続行が場合により必要です。たとえば、アプリへの登録前にユーザーがショッピング カートに追加したアイテムを、新しいアカウントのショッピング カートに追加できるようにします。これを行う手順は次のとおりです。

  1. ユーザーがアプリに登録したら、ユーザーの認証プロバイダのログインフローを行います(ただし、いずれかの FirebaseAuth.signInWith メソッドを呼び出す手前まで)。たとえば、ユーザーの Google ID トークンFacebook アクセス トークン、メールアドレスとパスワードを取得します。
  2. 新しい認証プロバイダの AuthCredential を取得します。

    Google ログイン
    AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);
    
    Facebook ログイン
    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    
    メールとパスワードによるログイン
    AuthCredential credential = EmailAuthProvider.getCredential(email, password);
    
  3. ログイン ユーザーの linkWithCredential メソッドに AuthCredential オブジェクトを渡します。

    mAuth.getCurrentUser().linkWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    Log.d(TAG, "linkWithCredential: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(AnonymousAuthActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                    }
    
                    // ...
                }
            });
    

linkWithCredential の呼び出しが成功したら、ユーザーの新しいアカウントが匿名アカウントの Firebase データにアクセスできるようになります。

次のステップ

これで、ユーザーが Firebase で認証できるようになったため、Firebase ルールを使用して、Firebase データベースのデータに対するユーザーのアクセス権を制御できます。

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