Skip to main content
カスタムログイン UI を備えた Native アプリケーションおよびバックエンドアプリケーションでは、Universal Login にリダイレクトすることなく、Auth0 Authentication API を介してメールアドレスまたは電話番号に直接送信されるワンタイムパスワード (OTP) でユーザーを認証できます。標準のデータベース接続で、メール OTP、SMS OTP、音声 OTP をサポートします。 これにより、すでにユーザーを保存しているデータベース接続でワンタイムコード認証を利用できます。以前、専用のパスワードレス接続で /passwordless/start を使用していた場合は、既存のデータベース接続に統合できます。Universal Login でパスワードレス認証を使用する方法については、データベース接続のパスワードレス認証を参照してください。
Passwordless OTP グラントは、シングルページアプリケーション (SPA) タイプのアプリケーションでは利用できません。フロントエンドがシングルページアプリケーションの場合は、Passwordless OTP グラントを有効にしたバックエンドアプリケーションから /otp/challenge/oauth/token を呼び出してください。
認証は、次の 2 回の呼び出しで構成されるフローです。
  1. POST /otp/challenge — ユーザーのメールアドレスまたは電話番号にワンタイムコードを送信します。
  2. POST /oauth/token — ユーザーが入力したコードをトークンと交換します。

仕組み

  1. ユーザーがアプリケーションでメールアドレスまたは電話番号を入力します。
  2. アプリケーションがPOST /otp/challengeエンドポイントを呼び出します。
  3. Auth0 Authorization Serverが、ユーザーのメールアドレスまたは電話番号宛てにワンタイムコードを送信します。
  4. Auth0 Authorization Serverがauth_session値を返します。この値を保存してください。ほかにstateを保持する必要はありません。
  5. ユーザーがコードを受け取り、アプリケーションのUIに入力します。
  6. アプリケーションがauth_sessionとユーザーが入力したコードを指定して、POST /oauth/tokenエンドポイントを呼び出します。
  7. Auth0 Authorization Serverがauth_sessionに対してコードを検証し、ID トークンとアクセストークン (必要に応じてリフレッシュトークンも) を返します。
このフローは、アプリケーションの観点ではステートレスです。2回の呼び出しの間で保持する値は、手順4で返されるauth_session文字列だけです。リクエストがログインかサインアップか、またMFAが必要かどうかはAuth0が判断するため、それらを自分で管理する必要はありません。詳細については、Auth0がログインとサインアップを判断する方法をお読みください。

開始前に

  • データベース接続で、認証方法としてemail_otpおよび/またはphone_otpを設定します。詳細については、データベース接続でのパスワードレス認証をお読みください。
  • 暗黙的なサインアップフローでユーザーがサインアップできるようにする場合は、サインアップ時のOTP検証を有効にします。詳細については、データベース接続でのパスワードレス認証をお読みください。
  • Auth0 DashboardまたはManagement APIでPasswordless OTPグラントを有効にします。詳細については、グラントタイプの更新をお読みください。
  • バックエンドWebアプリケーションなどの機密アプリケーションは、両方の呼び出しでclient_secretを送信する必要があります。ネイティブアプリケーションなどのパブリッククライアントでは必要ありません。
  • 音声OTPを使用するには、音声を配信チャネルとして使用できるよう、Unified Phone Experienceを有効にします。

OTP チャレンジを開始する

ユーザーの識別子を送信します。Auth0 がコードを生成・配信し、不透明な auth_session を返します。

パラメータ

フィールド名 (email または phone_number) によって、Auth0 が使用するチャネルが決まります。識別子の type を別途送信する必要はありません。

レスポンス

/otp/challenge は、ユーザーが存在するかどうかにかかわらず 200 OK を返します。これにより、ユーザー列挙を防止します。攻撃者はこのエンドポイントを利用して、どの識別子にアカウントが存在するかを特定できません。auth_session は不透明な文字列として扱い、保存したうえで変更せずに次の呼び出しに渡してください。

コードをトークンに交換する

ユーザーがコードを入力したら、前回のcallで取得したauth_sessionとともに送信します。

パラメータ

レスポンス

暗黙的なサインアップ

デフォルトでは、Authentication API は allow_signup: false により既存のユーザーのみを認証します。POST /otp/challengeallow_signup: true を指定すると、ユーザーがまだ存在せず、接続でサインアップが有効になっている場合、OTP の検証に成功した時点でアカウントを作成できます。
  • allow_signup: false: Auth0 がユーザーを作成することはありません。未知の識別子はトークン交換時に失敗します。
  • allow_signup: true: ユーザーが存在せず、接続でサインアップが許可されている場合、OTP の検証時にアカウントが作成され、同じステップでトークンが発行されます。
暗黙的なサインアップを成功させるには、接続で単一の識別子を必須にするか、すべての識別子を任意にする必要があります。詳細については、パスワードレスデータベース接続での暗黙的なサインアップとログインを参照してください。

Auth0 によるログインとサインアップの判別方法

ユーザーが新規か既存かにかかわらず、アプリケーションは常に同じ 2 つの呼び出しを行います。Auth0 は challenge 時に意図を判別し、サーバー側で auth_session に記録します。トークン交換時に、Auth0 はセッションを参照して適切な処理を行います。
ブロックされている場合は、意図的に誤った OTP の場合と同じエラーが返されるため、レスポンスからアカウントの存在有無が明らかになることはありません。

多要素認証

MFA が必要な場合、POST /oauth/tokenmfa_required エラーを含む 403 を返します。
mfa_token を使用して MFA API を呼び出し、追加の認証要素に対するチャレンジと検証を行います。この動作は、他のすべての Auth0 グラントタイプにおける MFA の動作と同じです。

エラー応答

どちらのエンドポイントも、RFC 6749 に基づく OAuth 2.0 のエラー形式を使用します。この形式には、error コードと人間が読み取れる error_description が含まれます。パラメータのバリデーションに失敗した場合 (400) には、該当するフィールドを特定する validation_errors 配列も含まれます。

POST /otp/challenge

POST /oauth/token

レート制限

POST /otp/challenge は、グローバルなAuthentication API のレート制限に加え、IP アドレスごとに 1 時間あたり 50 リクエストに制限されています。制限を超えると、429 Too Many Requests が返されます。 レート制限が適用されたレスポンスには、次のヘッダーが含まれます。

制限事項

  • シングルページアプリケーション (SPA) ではPasswordless OTPグラントを有効にできないため、これらのエンドポイントを直接使用することはできません。有効なグラントを持つバックエンドアプリケーション経由で呼び出してください。
  • 機密アプリケーションは、両方の呼び出しで client_secret を送信する必要があります。
  • Authentication API は、メールまたは電話のOTPが設定されたデータベース接続に対して認証を行います。メールまたはSMS専用のパスワードレス接続において、/passwordless/start の代替となるものではありません。

詳細情報