メインコンテンツへスキップ
Auth0は、ユニバーサルログインを使用した組み込みの登録と認証フローを提供します。ただし、独自のインターフェイスを作成したい場合は、MFA APIを使用することもできます。 GuardianアプリケーションまたはMFA APIを用いたSDKを使用して、プッシュ通知でユーザーの登録とチャレンジを行うことができます。

前提条件

MFA APIを使用するには、事前にアプリケーションに対してMFAの付与タイプを有効にする必要があります。[Auth0 Dashboard]>[Applications(アプリケーション)]>[Advanced Settings(詳細設定)]>[Grant Types(付与タイプ)]に移動し、[MFA] を選択します。

プッシュで登録する

MFAトークンを取得する

登録をトリガーするタイミングによっては、以下のような方法で、MFA APIを使用するためのアクセストークンを取得できます。

Authenticatorを登録する

ユーザーの鑑別工具を登録するには、MFA Associateエンドポイントに POST要求を送信します。このエンドポイントに必要なベアラートークンは、前の手順で取得したMFAトークンです。 プッシュで登録するには、authenticator_typesパラメーターを[oob]oob_channelsパラメーターを[auth0]に設定します。
curl --request POST \
  --url 'https://{yourDomain}/mfa/associate' \
  --header 'authorization: Bearer MFA_TOKEN' \
  --header 'content-type: application/json' \
  --data '{ "authenticator_types": ["oob"], "oob_channels": ["auth0"] }'
成功すると、次のような応答を受け取ります:
{
    "authenticator_type": "oob",
    "barcode_uri": "otpauth://totp/tenant:user?enrollment_tx_id=qfjn2eiNYSjU3xID7dBYeCBSrdREWJPY&base_url=tenan",
    "recovery_codes": [
        "ALKE6EJZ4853BJYLM2DM2WU7"
    ],
    "oob_channel": "auth0",
    "oob_code": "Fe26.2...SYAg"
}
User is already enrolled(ユーザーは登録済みです)」というエラーメッセージを受け取った場合、そのユーザーはすでにMFA要素を登録済みです。このユーザーに対して別の要素を関連付ける前に、既存の要素を使ってユーザーにチャレンジする必要があります。 ユーザーが鑑別工具を初めて関連付けている場合は、応答にrecovery_codesが含まれます。復旧コードは、ユーザーが第二の認証要素であるアカウントやデバイスにアクセスできなくなったときに、ユーザーのアカウントにアクセスするために使用されます。このコードは1回しか使用できず、必要に応じて新しいコードが生成されます。

プッシュの登録を確定する

プッシュの登録を確定するには、エンドユーザーが5分以内にGuardianアプリケーションのbarcode_uriでQRコードをスキャンする必要があります。 完了すると、ユーザーが正常に登録されたことをGuardianアプリケーションがAuth0に通知します。スキャンされたかを知るためには、MFA Associateエンドポイントの呼び出しで返されたoob_codeを使用して、Auth0トークンエンドポイントをポーリングします。
curl --request POST \
  --url 'https://{yourDomain}/oauth/token' \
  --header 'authorization: Bearer {mfaToken}' \
  --header 'content-type: application/x-www-form-urlencoded' \
  --data grant_type=http://auth0.com/oauth/grant-type/mfa-oob \
  --data 'client_id={yourClientId}' \
  --data 'client_secret={yourClientSecret}' \
  --data 'mfa_token={mfaToken}' \
  --data 'oob_code={oobCode}'
ユーザーがコードをスキャンしなかった場合には、authorization_pending応答が返され、数秒以内にoauth_tokenをもう一度呼び出す必要があることが分かります。
{
    "error": "authorization_pending",
    "error_description": "Authorization pending: please repeat the request in a few seconds."
}
呼び出しが成功すると、アクセストークンを含む応答が以下のフォーマットで返されます。
{
  "id_token": "eyJ...i",
  "access_token": "eyJ...i",
  "expires_in": 600,
  "scope": "openid profile",
  "token_type": "Bearer"
}
この時点でAuthenticatorは完全に関連付けられ、利用可能な状態で、ユーザー用の認証トークンを取得します。 MFA Authenticatorエンドポイントを呼び出すことで、Authenticatorが確認されているかどうかをいつでも検証できます。Authenticatorが確認されている場合、activeに返される値はtrueです。

プッシュでチャレンジする

MFAトークンを取得する

「リソース所有者のパスワード付与とMFAで認証する」で説明されている手順に従ってMFAトークンを取得します。

登録されているオーセンティケーターを取得する

ユーザーにチャレンジするには、チャレンジしたい要素のauthenticator_idが必要です。登録された全Authenticatorの一覧は、MFA Authenticatorエンドポイントを使って表示できます:
curl --request GET \
  --url 'https://{yourDomain}/mfa/authenticators' \
  --header 'authorization: Bearer MFA_TOKEN' \
  --header 'content-type: application/json'
Authenticatorのリストは以下の形式で取得されます。
[
    {
        "id": "recovery-code|dev_Ahb2Tb0ujX3w7ilC",
        "authenticator_type": "recovery-code",
        "active": true
    },
    {
        "id": "push|dev_ZUla9SQ6tAIHSz6y",
        "authenticator_type": "oob",
        "active": true,
        "oob_channel": "auth0",
        "name": "user's device name"
    },
    {
        "id": "totp|dev_gJ6Y6vpSrjnKeT67",
        "authenticator_type": "otp",
        "active": true
    }
]
ユーザーがプッシュで登録すると、OTPでも登録されます。これは、ユーザーに接続がないシナリオについて、GuardianがOTPでのチャレンジに対応しているためです。

プッシュを使用してユーザーにチャレンジする

プッシュチャレンジをトリガーするには、対応するauthenticator_idmfa_tokenを使ってMFAチャレンジエンドポイントにPOSTを行います。
curl --request POST \
  --url 'https://{yourDomain}/mfa/challenge' \
  --data '{ "client_id": "{yourClientId}",  "client_secret": "{yourClientSecret", "challenge_type": "oob", "authenticator_id": "push|dev_ZUla9SQ6tAIHSz6y", "mfa_token": "{mfaToken}" }'

受信したコードを使って認証を完了します。

成功すると、以下の応答を受け取ります。
{
    "challenge_type": "oob",
    "oob_code": "Fe26...jGco"
}
アプリケーションは、ユーザーがプッシュ通知を受領するまで、OAuth0トークンエンドポイントをポーリングしなければなりません。
curl --request POST \
  --url 'https://{yourDomain}/oauth/token' \
  --header 'content-type: application/x-www-form-urlencoded' \
  --data grant_type=http://auth0.com/oauth/grant-type/mfa-oob \
  --data 'client_id={yourClientId}' \
  --data 'client_secret={yourClientSecret}' \
  --data 'mfa_token={mfaToken}' \
  --data 'oob_code={oobCode}'
呼び出しでは、以下の結果のうち1つが返されます。
結果説明
authorization_pendingエラー:チャレンジが受け入れられなかったか拒否された場合。
slow_downエラー:ポーリングの頻度が高すぎる場合。
access_tokenrefresh_tokenチャレンジが受け入れられた場合。ポーリングはこの時点で停止されます。
invalid_grantエラー:チャレンジが拒否された場合。ポーリングはこの時点で停止されます。

もっと詳しく

I