この記事は Laurence Moroney、スタッフ デベロッパー アドボケートによる The Firebase Blog の記事 "Email Verification in Firebase Auth" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
Google I/O 2016 での初リリース以来、Firebase Auth は、ユーザーがアプリ上でアカウントを作成し、メールアドレスとパスワードを使ってログインする機能を提供してきました。しかし、これまでは、確認プロセスを通して実際のアカウントにメールアドレスがリンクされるわけではなかったため、どのようなアドレスでも使うことができました。そのため、もしユーザーが望むなら、[有名人の名前]@[任意のドメイン] といったアドレスを使ってログインすることも可能でした。
この問題を解決するために、 メール確認の手順が Firebase Auth に追加されました。先ほどの例では、Firebase により確認用のリンクを含むメールがそのアドレスに送信されることになります。もし本当にその有名人がアプリにユーザー登録しようとしているのであれば、リンク付きのメールが本人に届き、そのリンクをクリックすることでアプリにログインできるようになります。アカウントの確認が完了しているかどうかをログイン時にチェックすれば、必要に応じてログインをブロックするなどの処理を実行できます。
このアプリを起動して、メールとパスワードによる認証アクティビティを選択すると、次の画面が表示され、ログインするか(すでにアカウントを持っている場合)、アカウントを新規作成するか(まだアカウントを持っていない場合)を選択するよう求められます。
アカウントを作成する [Create Account] ボタンをクリックすると、新しいアクティビティに進み、現在のユーザー ID とそれに紐付けられた Firebase User ID が表示されます。さらに、メールアドレスの確認が完了していないことを示すメッセージと、確認を行うためのボタンも表示されます。
メールアドレスの確認を行う [Verify Email] ボタンをクリックすると、表示されているアドレスにメールが送信されます。このメールにはリンクが含まれ、ユーザーがそのリンクをクリックすると、アカウントの確認が完了します。
このメールの内容は、Firebase コンソールの [Authentication] セクションにある [Email Templates] タブで確認できます。このタブではアクションリンクを編集したり、上の例にある authui-xxxx.firebaseapp.com ではなく、実際のドメインを返信先アドレスで使用することができます。
アカウントの確認が完了してからもう一度ログインすると、画面の表示が次のように変わります。
さらに、Firebase コンソールにこの ID がユーザーとして表示されます。パスワードを変更したり、アプリからユーザーを完全に削除するといった管理作業は、この画面から行えます。
メール確認を行うための実装
Laurence Moroney
Developer AdvocateGoogle I/O 2016 での初リリース以来、Firebase Auth は、ユーザーがアプリ上でアカウントを作成し、メールアドレスとパスワードを使ってログインする機能を提供してきました。しかし、これまでは、確認プロセスを通して実際のアカウントにメールアドレスがリンクされるわけではなかったため、どのようなアドレスでも使うことができました。そのため、もしユーザーが望むなら、[有名人の名前]@[任意のドメイン] といったアドレスを使ってログインすることも可能でした。
この問題を解決するために、 メール確認の手順が Firebase Auth に追加されました。先ほどの例では、Firebase により確認用のリンクを含むメールがそのアドレスに送信されることになります。もし本当にその有名人がアプリにユーザー登録しようとしているのであれば、リンク付きのメールが本人に届き、そのリンクをクリックすることでアプリにログインできるようになります。アカウントの確認が完了しているかどうかをログイン時にチェックすれば、必要に応じてログインをブロックするなどの処理を実行できます。
- メール確認の詳細
このアプリを起動して、メールとパスワードによる認証アクティビティを選択すると、次の画面が表示され、ログインするか(すでにアカウントを持っている場合)、アカウントを新規作成するか(まだアカウントを持っていない場合)を選択するよう求められます。
アカウントを作成する [Create Account] ボタンをクリックすると、新しいアクティビティに進み、現在のユーザー ID とそれに紐付けられた Firebase User ID が表示されます。さらに、メールアドレスの確認が完了していないことを示すメッセージと、確認を行うためのボタンも表示されます。
メールアドレスの確認を行う [Verify Email] ボタンをクリックすると、表示されているアドレスにメールが送信されます。このメールにはリンクが含まれ、ユーザーがそのリンクをクリックすると、アカウントの確認が完了します。
このメールの内容は、Firebase コンソールの [Authentication] セクションにある [Email Templates] タブで確認できます。このタブではアクションリンクを編集したり、上の例にある authui-xxxx.firebaseapp.com ではなく、実際のドメインを返信先アドレスで使用することができます。
アカウントの確認が完了してからもう一度ログインすると、画面の表示が次のように変わります。
さらに、Firebase コンソールにこの ID がユーザーとして表示されます。パスワードを変更したり、アプリからユーザーを完全に削除するといった管理作業は、この画面から行えます。
メール確認を行うための実装
メール確認を行うための実装の詳細は、Firebase ドキュメントのユーザーの管理に関するセクション(Android、iOS、ウェブ)で参照できます。本投稿の以降の部分では Android のコードについて説明しますが、他のプラットフォームでの実装もほぼ同じです。
中核となる機能は、FirebaseUserオブジェクトに含まれています。そこにある sendEmailVerification() メソッドは、非同期的にメールを送信し、そのステータスを報告する Taskを返します。タスクが成功すると、メールが送信されたことが通知されます。次に例を示します。
このケースでは、
ユーザーがメールのリンクをクリックした後に
FirebaseUser オブジェクトはアプリのセッションが続いている間だけキャッシュされる点に注意してください。そのため、ユーザーの確認ステータスをチェックしたいときは、キャッシュをアップデートするために
このサンプルアプリでは、ユーザーのメールアドレスが確認済みかどうかをアクティビティで表示しているだけですが、このステータスに応じてアプリの機能を制限したり、ログインが必要なセクションへのアクセスを禁止したりすることも可能です。
Google、Facebook、Twitter などの他のプロバイダを使ったログインなど、Firebase Auth の詳細は Firebase デベロッパー サイトをご覧ください。
Posted by Khanh LeViet - Developer Relations Team
final FirebaseUser user = mAuth.getCurrentUser();
user.sendEmailVerification()
.addOnCompleteListener(this, new OnCompleteListener() {
@Override
public void onComplete(@NonNull Tasktask) {
// Re-enable button
findViewById(R.id.verify_email_button).setEnabled(true);
if (task.isSuccessful()) {
Toast.makeText(EmailPasswordActivity.this,
"Verification email sent to " + user.getEmail(),
Toast.LENGTH_SHORT).show();
} else {
Log.e(TAG, "sendEmailVerification", task.getException());
Toast.makeText(EmailPasswordActivity.this,
"Failed to send verification email.",
Toast.LENGTH_SHORT).show();
}
}
});
このケースでは、
mAuth.getCurrentUser()
でユーザーを取得し、そのユーザーに対して sendEmailVerification()
メソッドを呼び出しています。このメソッドを実行すると、Firebase によりメールが送信されます。タスクが成功すると、メールが送信されたことを示すトースト通知が表示されます。 ユーザーがメールのリンクをクリックした後に
user.isEmailVerified()
を呼び出すと true が返されます。サンプルアプリでは、これを次のように使用しています。 mStatusTextView.setText(getString(R.string.emailpassword_status_fmt,
user.getEmail(), user.isEmailVerified()));
FirebaseUser オブジェクトはアプリのセッションが続いている間だけキャッシュされる点に注意してください。そのため、ユーザーの確認ステータスをチェックしたいときは、キャッシュをアップデートするために
.getCurrentUser().reload()
を呼び出すとよいでしょう。このサンプルアプリでは、ユーザーのメールアドレスが確認済みかどうかをアクティビティで表示しているだけですが、このステータスに応じてアプリの機能を制限したり、ログインが必要なセクションへのアクセスを禁止したりすることも可能です。
Google、Facebook、Twitter などの他のプロバイダを使ったログインなど、Firebase Auth の詳細は Firebase デベロッパー サイトをご覧ください。
Posted by Khanh LeViet - Developer Relations Team