メインコンテンツへスキップ
Auth0は、ユニバーサルログインを使用した組み込みの登録と認証フローを提供します。ただし、独自のインターフェイスを作成したい場合は、MFA APIを使用することもできます。

前提条件

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

SMSまたは音声で登録する

MFAトークンを取得する

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

Authenticatorを登録する

ユーザーの鑑別工具を登録するには、MFA Associateエンドポイントに POST要求を送信します。このエンドポイントに必要なベアラートークンは、前の手順で取得したMFAトークンです。 SMSや音声で登録するには、SMSまたは音声でチャレンジできる電話番号を使って登録します。以下のパラメーターを指定してエンドポイントを呼び出します。oob_channelsパラメーターは、ユーザーにコードを送信する方法(SMSまたは音声)を指定します。
curl --request POST \
--url 'https://{yourDomain}/mfa/associate' \
--header 'authorization: Bearer {mfaToken}' \
--header 'content-type: application/json' \
--data '{ "authenticator_types": ["oob"], "oob_channels": ["sms"], "phone_number": "+11...9" }'
``` lines
```csharp C# lines
var client = new RestClient("https://{yourDomain}/mfa/associate");
var request = new RestRequest(Method.POST);
request.AddHeader("authorization", "Bearer {mfaToken}");
request.AddHeader("content-type", "application/json");
request.AddParameter("application/json", "{ \"authenticator_types\": [\"oob\"], \"oob_channels\": [\"sms\"], \"phone_number\": \"+11...9\" }", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
パラメーター
authentication_types[oob]
oob_channels[sms]または[voice]
phone_number+11…9E.164形式の電話番号
成功すると、次のような応答を受け取ります:
{
  "authenticator_type": "oob",
  "binding_method": "prompt",
  "recovery_codes": [ "N3BGPZZWJ85JLCNPZBDW6QXC" ],
  "oob_channel": "sms",
  "oob_code": "ata6daXAiOi..."
}
`
User is already enrolled(ユーザーは登録済みです)」というエラーメッセージを受け取った場合、そのユーザーはすでにMFA要素を登録済みです。このユーザーに対して別の要素を関連付ける前に、既存の要素を使ってユーザーにチャレンジする必要があります。 ユーザーが鑑別工具を初めて関連付けている場合は、応答にrecovery_codesが含まれます。復旧コードは、ユーザーが第二の認証要素であるアカウントやデバイスにアクセスできなくなったときに、ユーザーのアカウントにアクセスするために使用されます。このコードは1回しか使用できず、必要に応じて新しいコードが生成されます。

SMSまたは音声の登録を確定する

ユーザーは、アプリケーションに提供しなければならない6桁のコードが記載されたメッセージを受信します。 登録を完了するには、トークンエンドポイントにPOST要求を行います。メッセージで受け取った値とともに、前の応答で返されたoob_codebinding_codeを含める必要があります。
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}' \
--data 'binding_code={userOtpCode}'
``` lines
```csharp C# lines
var client = new RestClient("https://{yourDomain}/oauth/token");
var request = new RestRequest(Method.POST);
request.AddHeader("authorization", "Bearer {mfaToken}");
request.AddHeader("content-type", "application/x-www-form-urlencoded");
request.AddParameter("application/x-www-form-urlencoded", "grant_type=http%3A%2F%2Fauth0.com%2Foauth%2Fgrant-type%2Fmfa-oob&client_id={yourClientId}&client_secret=%7ByourClientSecret%7D&mfa_token=%7BmfaToken%7D&oob_code=%7BoobCode%7D&binding_code=%7BuserOtpCode%7D", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
呼び出しが成功すると、アクセストークンを含む応答が以下の形式で返されます。
{
  "id_token": "eyJ...i",
  "access_token": "eyJ...i",
  "expires_in": 600,
  "scope": "openid profile",
  "token_type": "Bearer"
}

SMSまたは音声でチャレンジする

MFAトークンを取得する

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

登録されているAuthenticatorを取得する

ユーザーにチャレンジするには、チャレンジしたい要素のauthenticator_idが必要です。登録された全Authenticatorの一覧は、MFA Authenticatorエンドポイントを使って表示できます:
curl --request GET \
--url 'https://{yourDomain}/mfa/authenticators' \
--header 'authorization: Bearer MFA_TOKEN' \
--header 'content-type: application/json'
``` lines
```csharp C# lines
var client = new RestClient("https://{yourDomain}/mfa/authenticators");
var request = new RestRequest(Method.GET);
request.AddHeader("authorization", "Bearer MFA_TOKEN");
request.AddHeader("content-type", "application/json");
IRestResponse response = client.Execute(request);
Authenticatorのリストが以下の形式で返されます。
[
    {
        "id": "recovery-code|dev_O4KYL4FtcLAVRsCl",
        "authenticator_type": "recovery-code",
        "active": true
    },
    {
        "id": "sms|dev_NU1Ofuw3Cw0XCt5x",
        "authenticator_type": "oob",
        "active": true,
        "oob_channel": "sms",
        "name": "XXXXXXXX8730"
    },
        {
        "id": "voice|dev_NU1Ofuw3Cw0XCt5x",
        "authenticator_type": "oob",
        "active": true,
        "oob_channel": "voice",
        "name": "XXXXXXXX8730"
    }
]

OTPを使ってユーザーにチャレンジする

メールチャレンジをトリガーするには、対応するauthenticator_idmfa_tokenを使ってMFAチャレンジエンドポイントをPOSTします。
curl --request POST \
--url 'https://{yourDomain}/mfa/challenge' \
--header 'content-type: application/json' \
--data '{ "client_id": "{yourClientId}", "client_secret": "{yourClientSecret}", "challenge_type": "oob", "authenticator_id": "sms|dev_NU1Ofuw3Cw0XCt5x", "mfa_token": "{mfaToken}" }'
``` lines
```csharp C# lines
var client = new RestClient("https://{yourDomain}/mfa/challenge");
var request = new RestRequest(Method.POST);
request.AddHeader("content-type", "application/json");
request.AddParameter("application/json", "{ \"client_id\": \"{yourClientId}\", \"client_secret\": \"{yourClientSecret}\", \"challenge_type\": \"oob\", \"authenticator_id\": \"sms|dev_NU1Ofuw3Cw0XCt5x\", \"mfa_token\": \"{mfaToken}\" }", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);

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

成功すると以下の応答を受け取ります。
{
  "challenge_type": "oob",
  "oob_code": "asdae35fdt5...",
  "binding_method": "prompt"
}
アプリケーションは、メッセージで送信した6桁のコードをユーザーに求めて、binding_codeパラメーター内に設定する必要があります。前の呼び出しで返されたbinding_codeoob_codeを指定して、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}' \
--data binding_code=USER_OTP_CODE
``` lines
```csharp C# lines
var client = new RestClient("https://{yourDomain}/oauth/token");
var request = new RestRequest(Method.POST);
request.AddHeader("content-type", "application/x-www-form-urlencoded");
request.AddParameter("application/x-www-form-urlencoded", "grant_type=http%3A%2F%2Fauth0.com%2Foauth%2Fgrant-type%2Fmfa-oob&client_id={yourClientId}&client_secret=%7ByourClientSecret%7D&mfa_token=%7BmfaToken%7D&oob_code=%7BoobCode%7D&binding_code=USER_OTP_CODE", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
呼び出しが成功すると、アクセストークンを含む応答が以下の形式で返されます:
{
  "id_token": "eyJ...i",
  "access_token": "eyJ...i",
  "expires_in": 600,
  "scope": "openid profile",
  "token_type": "Bearer"
}
**注意:**SMSと無効なコードの返信はレート制限の対象になります。SMSコードは10回まで送信でき、1時間ごとに1回が補充されます。無効なコードは10回まで返信でき、6分ごとに1回が補充されます。

もっと詳しく

I