【Auth0】メールアドレスの確認が済んでいないユーザーのログインを拒否する


はじめに

Auth0はサインアップ時にログインIDとして登録されたメールアドレスに確認のメールを送ります。
ユーザーが確認メールに記載されているリンクにアクセスすることでメールアドレスのステータスが確認済みとなります。

本記事ではAuth0にRulesを使ってメールアドレスが未確認の場合はログインを拒否することでアプリケーションの利用開始前にユーザーにメールアドレスの確認を強制する方法を紹介します。

Rulesの設定

管理画面のRulesのページにアクセスしCREATE RULEを押して新しいRuleを作成します。

標準で多数のRuleテンプレートが用意されています。
メールアドレスの確認を強制するRule(Force email verification)も標準で用意されているのでこれをそのまま利用します。

選択すると以下のコードが展開されるのでこれを保存します。

function emailVerified(user, context, callback) {
  if (!user.email_verified) {
    return callback(new UnauthorizedError('Please verify your email before logging in.'));
  } else {
    return callback(null, user, context);
  }
}

このRuleが有効な状態でメールアドレスが未確認状態のユーザーがログインするとUnauthorizedErrorが発生します。
アプリケーション側には以下のようなURLでコールバックされます。

コールバック例
https://example.com/callback?error=unauthorized&error_description=Please%20verify%20your%20email%20before%20logging%20in.&state=3ZO2lgVJkICccAxQVvmz9P9o34ccbmeW

errorerror_descriptionパラメーターでエラーを判断することができます。

エラー発生時のアプリケーション側の対応

メールアドレス未確認によってコールバックされたときにアプリケーション側でエラー処理が必要になります。
エラーの内容を読み取ってユーザーに新規登録時に送信したメールの確認を促します。

エラーメッセージの工夫

コールバックされたときのerrorパラメーターの値だとunauthorizedとしか読みとれません。
他にもエラーを出力する可能性のあるRulesを設定しているとerrorパラメーターでは事象を正確に捉えられない恐れがあるので
error_descriptionにエラーコードなどを埋め込むことで事象の切り分けをできるようにすることをお勧めします。

return callback(new UnauthorizedError('[00043] - Please verify your email before logging in.'));

参考
https://auth0.com/docs/best-practices/error-handling

おわりに

ログイン前にメールアドレスの確認を強制したい場合はぜひこのRulesを使ってみてください。
コードのテンプレートが用意されているのでとても簡単に導入できます。