メインコンテンツへスキップ
Auth0 では、データベース接続で、メールアドレスおよび電話番号を使用したパスワードレス認証を直接設定できます。OTP 認証用に別個の接続を作成しなくても、データベース接続から直接パスワードレスログインを提供できます。これにより、実装の複雑さが軽減され、エンドユーザーのログイン体験もシンプルになります。
データベース接続でのパスワードレス認証は、Classic Login ではサポートされていません。

仕組み

Auth0 では、ユーザーを OTP 認証で検証する Identifier-First Authentication アプローチを採用しています。
  1. エンドユーザーが、Auth0 の Universal Login でログインに使用する識別子を入力します。
  2. Auth0 は、データベース接続で設定された各識別子に対応する認証方法を確認します。
  3. default_method と利用可能な認証方法に基づいて、ユーザーに最も適した選択肢が提示されます (たとえば、メールアドレスまたは電話番号で OTP を受け取る、またはパスワードを入力するなど) 。
  4. OTP が選択された認証方法である場合、Auth0 はユーザーのメールアドレスまたは電話番号にコードを送信します。
  5. ユーザーがコードを入力すると認証されます。パスキーを設定している場合は、段階的なパスキー登録を求められます。

開始する前に

  • テナントが Identifier-First Authentication Profile を使用するように設定します。
  • 電話番号ベースの OTP (SMS または音声) を使用する予定がある場合は、Branding > Phone ProviderUnified Phone Experience 設定を有効にする必要があります。
  • データベース接続で 属性 を有効にする必要があります。
  • 既存の (レガシー) パスワードレス接続を、データベース接続でのパスワードレス認証と併用する予定で、かつ既存のパスワードレス接続で Unified Phone Provider を使用するよう設定したくない場合:
    1. Auth0 Dashboard > Authentication > Passwordless に移動します。
    2. SMS の Configure を選択します。
    3. Use Tenant-Level Messaging Provider 設定が無効になっていることを確認します。

属性 (識別子) を設定する

データベース接続でメールアドレスまたは電話番号ベースのパスワードレス認証を設定する場合は、まず、サインアップ時とログイン時にエンドユーザーに入力してもらう属性を決定する必要があります。 識別子の種類と、それぞれに対応する認証方法を確認してください。
識別子認証方法
メールアドレスパスワード、メールアドレス OTP、パスキー
電話番号パスワード、電話番号 OTP、パスキー
usernameパスワード
メールアドレス識別子および電話番号識別子では、パスワードが有効になっていない場合、サインアップ時の OTP 検証を有効にしておく必要があります。メールアドレス属性と電話番号属性は、サインアップ時に任意項目として設定できるため、ユーザーはメールアドレスのみ、または電話番号のみでサインアップできます。 ユーザーがメールアドレス OTP で認証すると、プロフィールの email_verified は自動的に true に設定されます。ユーザーが電話番号 OTP で認証すると、phone_verified は自動的に true に設定されます。
エンドユーザーにパスキーで認証させる場合は、メールアドレスや電話番号などの代替の認証方法を必ず設定しておく必要があります。パスキーのみの認証はサポートされていません。
詳しくは、柔軟な識別子向けの属性を有効化して設定するを参照してください。

新しいデータベース接続を作成する

既存のデータベース接続がない場合は、Auth0 Dashboard または Management API を使用して作成します。
  1. Auth0 Dashboard > Authentication > Database に移動します。接続を作成するには、Create DB Connection を選択します。
  2. 接続に一意の名前を入力します。
  3. エンドユーザーがログインまたはサインアップに使用する属性を 1 つ以上選択します。
  4. 認証方法を選択します。これらの認証方法は、接続の作成後にさらに設定できます。
  5. 公開エンドポイントを使用したユーザーのサインアップを許可しない場合は、Disable Sign Ups をオンにします。
  6. この接続をサードパーティアプリケーションで使用する場合は、Promote Connection to Domain Level をオンにします。
  7. Create を選択します。
完全なパスワードレス接続にするには、さらに次の手順を実行します。
  1. 新しい接続で、Attributes タブを選択します。
  2. 識別子として Username を無効にするには、Configure を選択し、Use Username as Identifier をオフにします。
  3. Email と Phone の識別子を設定するには、Configure を選択します。
  • Email 属性では、Verification Methods の One-Time Password (OTP) を選択し、完全なパスワードレス構成にするため Verify email on sign up を有効にします。これにより email_verified が自動的に設定されるため、ユーザーにはログイン時とサインアップ時に常に OTP の入力が求められます。
  1. Save を選択します。
  2. 選択した識別子に対応する認証方法を設定します。phone_otp および/または email_otp が設定されていない場合は、パスワードを無効にできません。
  3. Password settings で Policy を選択し、次の項目に対して Block を選択します。
    • Password on Login
    • Password on Signup
    • Self-service change password (自動更新)
  4. Support users without a password をオンにします。
    Support users without a password をオンにしないと、エラーが発生する場合があります。
  5. Save を選択します。表示されたプロンプトで Continue を選択し、既存のユーザーに影響が及ぶ可能性があることを確認します。
  6. Applications タブに移動し、アプリケーションまたは API でこの接続を有効にします。

既存の接続を更新する

既存のデータベース接続がある場合は、Auth0 Dashboard または Management API でパスワードレスの設定を更新します。
  1. 接続を開く: Auth0 Dashboard > Authentication > Database に移動し、更新する接続を選択します。
  2. Attributes を有効にする: Attributes タブで Activate を選択し、新しい Attributes Configuration を有効にします。
  3. メールアドレス属性と電話番号属性を追加する: + Add Attributes を選択し、まだ追加されていない場合は Email と Phone Number を追加します。
    完全なパスワードレス (OTP) 接続では、username 識別子はサポートされていません。
  4. OTP 認証方法を有効にする: Authentication Methods タブで次の操作を行います。
    • Phone を Allow Phone OTP に設定し、変更を保存します。
    • Email を Allow Email OTP に設定し、変更を保存します。
  5. パスワード認証をブロックする: Password 設定で Policy を選択し、次の項目を Block に設定します。
    • Login での Password
    • Signup での Password
    • セルフサービスでのパスワード変更
    Support users without a password をオンにします。
    Support users without a password をオンにしないと、エラーが発生する場合があります。
  6. 保存: Save を選択します。

Auth0 Actions を使用する

データベース接続のパスワードレス認証要素に関する詳細情報を得るには、Auth0 Actions を使用して属性を設定します。

Post-login トリガー

post-login トリガーは、ユーザーの認証後、認可サーバーがトークンを返す前に実行されます。Auth0 Dashboard > Actions > Triggers > Post Loginevent.authentication オブジェクトでは、次のメソッドを利用できます。
メソッドパラメーター説明
メールアドレス OTPemailユーザーの第 1 要素の認証に使用されるメール OTP。
SMS による電話番号 OTPsmsユーザーの第 1 要素の認証に使用される電話番号 OTP (SMS) 。
音声による電話番号 OTPtelユーザーの第 1 要素の認証に使用される音声による電話番号 OTP。
パスワードpwdユーザーの第 1 要素の認証に使用されるパスワード。
ユーザーがメールアドレス OTP または電話番号 OTP で認証されると、email_verifiedphone_verified はユーザープロファイルに自動的に設定されます。以前、これらのフラグを手動で設定するために post-login Action を使用していた場合は、そのワークアラウンドを削除できます。
event.authentication を使用して、次のことができます。
  • ユーザーが完了したパスワードレス認証要素 (emailsmstel、または pwd) を検出する
  • 認証方法に基づいてトークンにカスタムクレームを追加する
  • ユーザーの認証方法に応じて条件付きでロジックを実行する

次の例では、event.authentication.methods を参照して、ユーザーが完了したパスワードレスの認証要素を検出し、それを IDトークン のカスタムクレームとして追加します。
exports.onExecutePostLogin = async (event, api) => {
  if (!event.authentication?.methods || event.authentication.methods.length === 0) {
    return;
  }

  if (event.connection.name !== 'YOUR_AUTH0_CONNECTION') {
    return;
  }

  const firstFactor = event.authentication.methods[0];

  if (firstFactor.name === 'email') {
    api.idToken.setCustomClaim('https://your-app.com/auth_method', 'email_otp');
  } else if (firstFactor.name === 'sms' || firstFactor.name === 'tel') {
    api.idToken.setCustomClaim('https://your-app.com/auth_method', 'phone_otp');
  } else if (firstFactor.name === 'pwd') {
    api.idToken.setCustomClaim('https://your-app.com/auth_method', 'password');
  }
};

Post-challenge トリガー

post-challenge トリガーは、ユーザーがパスワードリセット、電話番号の検証、MFA などのチャレンジを完了した後に発火します。Auth0 Dashboard > Actions > Triggers > password-reset-post-challengeevent.authentication オブジェクトでは、次の属性を利用できます。
属性パラメーター説明
メールアドレスemailメールアドレス宛ての OTP またはマジックリンクを使用したパスワードリセット。
電話番号phone_number電話番号宛ての OTP を使用したパスワードリセット。

次の例では、event.authentication.methods を読み取って、どのパスワードレス認証要素でチャレンジが完了したかを判別し、それをIDトークンのカスタムクレームとして追加します。
exports.onExecutePostChallenge = async (event, api) => {
  if (!event.authentication?.methods || event.authentication.methods.length === 0) {
    return;
  }

  if (event.connection.name !== 'YOUR_AUTH0_CONNECTION') {
    return;
  }

  const firstFactor = event.authentication.methods[0];

  if (firstFactor.name === 'email') {
    api.idToken.setCustomClaim('https://your-app.com/challenge_method', 'email_otp');
  } else if (firstFactor.name === 'phone_number') {
    api.idToken.setCustomClaim('https://your-app.com/challenge_method', 'phone_otp');
  }
};

利点

  • 実装の簡素化: 設定や管理が必要な接続の数を減らせます。データベース接続と併せてソーシャル/フェデレーション接続を使用しない限り、アカウントリンクは必要ありません。
  • ユーザー体験の向上: Universal Login の同一の識別子ファースト体験で、メールアドレスや電話番号ベースの OTP、パスワード、パスキー、ソーシャル/フェデレーションログインを組み合わせて提供できます。
  • 柔軟なサインアップフロー: サインアップ時にメールアドレス属性と電話番号属性を任意に設定できるため、ユーザーはメールアドレスのみ、または電話番号のみでサインアップできます。モバイルファーストやメールアドレスのみの体験に最適です。
  • 音声 OTP: Unified Phone Experience で設定すると、音声 OTP を第 1 要素として含めることができます。

制限事項

  • Universal Login ベースのフローでのみ使用できます。API ベースの認証はまだサポートされていません。
  • データベース接続のパスワードレスは、Classic Login ではサポートされていません。
  • データベース接続のパスワードレスでは、Implicit Signup & Login はサポートされていません。
  • 従来のパスワードレス接続では、サインアップとログインでユーザー体験に違いはありませんでした。データベース接続ではサインアップ時とログイン時の体験が区別されるため、明示的にサインアップまたはログインする必要があります。
    • Auth0 アイデンティティを持たないユーザーがログインフローに入った場合、自動的にサインアップされることはありません。OTP の検証後にエラーが返されます。
    • Auth0 アイデンティティを持つユーザーがサインアップフローに入った場合は、OTP の検証後にエラーが返されます。

詳細情報