[翻訳] Firebase Authentication / Android / Manage Users

[Manage Users](https://firebase.google.com/docs/auth/android/manage-users) を翻訳してみました。
お気づきの点があればコメント頂ければと思います。

以下、関連する投稿へのリンクです。
■ [Firebase Authentication / Introduction](http://qiita.com/tnagao3000/items/a73023abd3ea3039975d)
■ [Firebase Authentication / Users in Firebase Projects](http://qiita.com/tnagao3000/items/97d3d42743edd3fa9ea3)
■ [**Firebase Authentication / Android / Manage Users**](http://qiita.com/tnagao3000/items/0c9d3d09ac3ba1600d23)
■ [Firebase Authentication / Android / Password Authentication](http://qiita.com/tnagao3000/items/a2a36355d740738803b5)
■ [Firebase Authentication / Android / Google Sign-In](http://qiita.com/tnagao3000/items/e602457099ee0fc8161d)
■ [Firebase Authentication / Android / Anonymous Authentication](http://qiita.com/tnagao3000/items/b6c6a63acc8b172a6756)

## Create a user
>
You create a new user in your Firebase project by calling the [createUserWithEmailAndPassword](https://firebase.google.com/docs/auth/android/password-auth#create_a_password-based_account) method or by signing in a user for the first time using a federated identity provider, such as [Google Sign-In](https://firebase.google.com/docs/auth/android/google-signin) or [Facebook Login](https://firebase.google.com/docs/auth/android/facebook-login).
>
You can also create new password-authenticated users from the Authentication section of the [Firebase console](https://firebase.google.com/console/), on the Users page.

あなたは[createUserWithEmailAndPassword](https://firebase.google.com/docs/auth/android/password-auth#create_a_password-based_account)メソッドを呼ぶか、または[Googleサインイン](https://firebase.google.com/docs/auth/android/google-signin)や[Facebookログイン](https://firebase.google.com/docs/auth/android/facebook-login)などのアイデンティティ・プロバイダを使用して初めてユーザーがサインインすることによりFirebaseプロジェクトに新しいユーザーを作成します。

またあなたは[Firebaseコンソール](https://firebase.google.com/console/)のAuthenticationセクションのユーザーページで新しいパスワード認証ユーザーを作成することもできます。

## Get the currently signed-in user
>
The recommended way to get the current user is by setting a listener on the Auth object:
>
```java
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");
        }
        // ...
    }
};
```
>
By using a listener, you ensure that the Auth object isn't in an intermediate state—such as initialization—when you get the current user.
>
You can also get the currently signed-in user by calling `getCurrentUser`. If a user isn't signed in, `getCurrentUser` returns null:
>
```java
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
    // User is signed in
} else {
    // No user is signed in
}
```
>
<strong>Note: getCurrentUser</strong> might also return null because the auth object has not finished initializing. If you use a listener to keep track of the user's sign-in status, you don't need to handle this case.


現在のユーザーを取得するための推奨される方法は、Authオブジェクトにリスナーを設定することです：

```java
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");
        }
        // ...
    }
};
```

リスナーを使用することにより、あなたが現在のユーザーを取得するときにAuthオブジェクトが(初期化中のような) 途中の状態ではないことを保証します。

また、あなたは`getCurrentUser`を呼び出して現在のサインインユーザーを取得することもできます。　もしユーザーがサインインしていなければ、`getCurrentUser`はnullを返します：

```java
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
    // User is signed in
} else {
    // No user is signed in
}
```

<strong>注意</strong> : authオブジェクトの初期化が完了していないため、<strong>getCurrentUser</strong>がnullを返すことがあります。　もしあなたがユーザーのサインイン ステータスの追跡にリスナーを使用するなら、このケースを処理する必要はありません。


## Get a user's profile
>
To get a user's profile information, use the accessor methods of an instance of `FirebaseUser`. For example:
>
```java
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
    // Name, email address, and profile photo Url
    String name = user.getDisplayName();
    String email = user.getEmail();
    Uri photoUrl = user.getPhotoUrl();
>
    // The user's ID, unique to the Firebase project. Do NOT use this value to
    // authenticate with your backend server, if you have one. Use
    // FirebaseUser.getToken() instead.
    String uid = user.getUid();
}
```

ユーザーのプロフィール情報を取得するには、`FirebaseUser`インスタンスのアクセサメソッドを使用します。 例：

```java
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
    // Name, email address, and profile photo Url
    String name = user.getDisplayName();
    String email = user.getEmail();
    Uri photoUrl = user.getPhotoUrl();

    // The user's ID, unique to the Firebase project. Do NOT use this value to
    // authenticate with your backend server, if you have one. Use
    // FirebaseUser.getToken() instead.
    String uid = user.getUid();
}
```


## Get a user's provider-specific profile information
>
To get the profile information retrieved from the sign-in providers linked to a user, use the `getProviderData` method. For example:
>
```java
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
    for (UserInfo profile : user.getProviderData()) {
        // Id of the provider (ex: google.com)
        String providerId = profile.getProviderId();
>
        // UID specific to the provider
        String uid = profile.getUid();
>
        // Name, email address, and profile photo Url
        String name = profile.getDisplayName();
        String email = profile.getEmail();
        Uri photoUrl = profile.getPhotoUrl();
    };
}
```

ユーザーにリンクされているサインイン プロバイダから引き出したプロフィール情報を取得するには、`getProviderData`メソッドを使用します。 例：

```java
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
    for (UserInfo profile : user.getProviderData()) {
        // Id of the provider (ex: google.com)
        String providerId = profile.getProviderId();

        // UID specific to the provider
        String uid = profile.getUid();

        // Name, email address, and profile photo Url
        String name = profile.getDisplayName();
        String email = profile.getEmail();
        Uri photoUrl = profile.getPhotoUrl();
    };
}
```


## Update a user's profile
>
You can update a user's basic profile information—the user's display name and profile photo URL—with the `updateProfile` method. For example:
>
```java
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
>
UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
        .setDisplayName("Jane Q. User")
        .setPhotoUri(Uri.parse("https://example.com/jane-q-user/profile.jpg"))
        .build();
>
user.updateProfile(profileUpdates)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "User profile updated.");
                }
            }
        });
```

あなたは`updateProfile`メソッドでユーザーの基本的なプロフィール情報（ユーザーの表示名とプロフィール写真URL）を更新できます。　例：

```java
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
        .setDisplayName("Jane Q. User")
        .setPhotoUri(Uri.parse("https://example.com/jane-q-user/profile.jpg"))
        .build();

user.updateProfile(profileUpdates)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "User profile updated.");
                }
            }
        });
```

## Set a user's email address
>
You can set a user's email address with the `updateEmail` method. For example:
>
```java
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
>
user.updateEmail("user@example.com")
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "User email address updated.");
                }
            }
        });
```
>
<strong>Important</strong>: To set a user's email address, the user must have signed in recently. See [Re-authenticate a user](https://firebase.google.com/docs/auth/android/manage-users#re-authenticate_a_user).


あなたは`updateEmail`メソッドでユーザーのメールアドレスをセットできます。　例：

```java
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

user.updateEmail("user@example.com")
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "User email address updated.");
                }
            }
        });
```

<strong>重要</strong>: ユーザーのメールアドレスをセットするためには、ユーザーが直前にサインインしている必要があります。　[ユーザーの再認証](https://firebase.google.com/docs/auth/android/manage-users#re-authenticate_a_user)を参照してください。

## Set a user's password
>
You can set a user's password with the `updatePassword` method. For example:
>
```java
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String newPassword = "SOME-SECURE-PASSWORD";
>
user.updatePassword(newPassword)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "User password updated.");
                }
            }
        });
```
>
<strong>Important</strong>: To set a user's password, the user must have signed in recently. See [Re-authenticate a user](https://firebase.google.com/docs/auth/android/manage-users#re-authenticate_a_user).

あなたは`updatePassword`メソッドでユーザーのパスワードをセットできます。　例：

```java
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String newPassword = "SOME-SECURE-PASSWORD";

user.updatePassword(newPassword)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "User password updated.");
                }
            }
        });
```

<strong>重要</strong>: ユーザーのパスワードをセットするためには、ユーザーが直前にサインインしている必要があります。　[ユーザーの再認証](https://firebase.google.com/docs/auth/android/manage-users#re-authenticate_a_user)を参照してください。


## Send a password reset email
>
You can send a password reset email to a user with the `sendPasswordResetEmail` method. For example:
>
```java
FirebaseAuth auth = FirebaseAuth.getInstance();
String emailAddress = "user@example.com";
>
auth.sendPasswordResetEmail(emailAddress)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "Email sent.");
                }
            }
        });
```
>
You can customize the email template that is used in Authentication section of the [Firebase console](https://firebase.google.com/console/), on the Email Templates page. See [Email Templates](https://support.google.com/firebase/answer/7000714) in Firebase Help Center.
>
You can also send password rest emails from the Firebase console.


あなたは`sendPasswordResetEmail`メソッドでパスワードリセットメールをユーザーに送信できます。　例：

```java
FirebaseAuth auth = FirebaseAuth.getInstance();
String emailAddress = "user@example.com";

auth.sendPasswordResetEmail(emailAddress)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "Email sent.");
                }
            }
        });
```

あなたは[Firebaseコンソール](https://firebase.google.com/console/)のAuthenticationセクションのメールテンプレートページで使用されるメールテンプレートをカスタマイズできます。　Firebaseヘルプセンターの[メールテンプレート](https://support.google.com/firebase/answer/7000714)を参照してください。

またあなたはFirebaseコンソールからパスワードリセットメールを送信できます。


## Delete a user
>
You can delete a user account with the `delete` method. For example:
>
```java
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
>
user.delete()
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "User account deleted.");
                }
            }
        });
```
>
<strong>Important</strong>: To delete a user, the user must have signed in recently. See [Re-authenticate a user](https://firebase.google.com/docs/auth/android/manage-users#re-authenticate_a_user).
>
You can also delete users from the Authentication section of the [Firebase console](https://firebase.google.com/console/), on the Users page.


あなたは`delete`メソッドでユーザーアカウントを削除できます。　例：

```java
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

user.delete()
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "User account deleted.");
                }
            }
        });
```

<strong>重要</strong>: ユーザーを削除するためには、直前にユーザーがサインインする必要があります。　[ユーザーの再認証](https://firebase.google.com/docs/auth/android/manage-users#re-authenticate_a_user)を参照してください。

また、あなたは[Firebaseコンソール](https://firebase.google.com/console/)のAuthenticationセクションのUsersページでユーザーを削除することもできます。


## Re-authenticate a user
>
Some security-sensitive actions—such as [deleting an account](https://firebase.google.com/docs/auth/android/manage-users#delete_a_user), [setting a primary email address](https://firebase.google.com/docs/auth/android/manage-users#set_a_users_email_address), and [changing a password](https://firebase.google.com/docs/auth/android/manage-users#set_a_users_password)—require that the user has recently signed in. If you perform one of these actions, and the user signed in too long ago, the action fails and throws [FirebaseAuthRecentLoginRequiredException](https://firebase.google.com/docs/reference/android/com/google/firebase/auth/FirebaseAuthRecentLoginRequiredException). When this happens, re-authenticate the user by getting new sign-in credentials from the user and passing the credentials to `reauthenticate`. For example:
>
```java
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
>
// Get auth credentials from the user for re-authentication. The example below shows
// email and password credentials but there are multiple possible providers,
// such as GoogleAuthProvider or FacebookAuthProvider.
AuthCredential credential = EmailAuthProvider
        .getCredential("user@example.com", "password1234");
>
// Prompt the user to re-provide their sign-in credentials
user.reauthenticate(credential)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                Log.d(TAG, "User re-authenticated.");
            }
        });
```

（[アカウントの削除](https://firebase.google.com/docs/auth/android/manage-users#delete_a_user)や[プライマリメールアドレスのセット](https://firebase.google.com/docs/auth/android/manage-users#set_a_users_email_address)や、[パスワード変更](https://firebase.google.com/docs/auth/android/manage-users#set_a_users_password)のような）一部のセキュリティに注意が必要なアクションには、ユーザーの直前のサインインが必要です。

もしあなたがこれらのアクションのうちの一つを実行し、またユーザーのサインインから時間がたちすぎていた場合、アクションは失敗し[FirebaseAuthRecentLoginRequiredException](https://firebase.google.com/docs/reference/android/com/google/firebase/auth/FirebaseAuthRecentLoginRequiredException)がスローされます。

これが発生した時は、ユーザーから新しいサインイン証明を取得して`reauthenticate`に渡すことでユーザーを再認証します。　例：

```java
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

// Get auth credentials from the user for re-authentication. The example below shows
// email and password credentials but there are multiple possible providers,
// such as GoogleAuthProvider or FacebookAuthProvider.
AuthCredential credential = EmailAuthProvider
        .getCredential("user@example.com", "password1234");

// Prompt the user to re-provide their sign-in credentials
user.reauthenticate(credential)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                Log.d(TAG, "User re-authenticated.");
            }
        });
```