クライアント起点バックチャネル認証 (CIBA) 機能を使用するには、Enterprise Plan または適切なアドオンが必要です。詳細については、Auth0 Pricing を参照してください。
CIBA でメール通知を使用すると、ユーザーはブラウザーでリクエストを認証または認可するためのリンクを含むメールを受信します。
CIBA でメール通知を使用する場合、ユーザーは利用端末でログインしますが、確認済みのメールアドレスに送信されたリンクをクリックして認証を完了します。ユーザーが確認リンクをクリックすると、ブラウザーにリダイレクトされ、Auth0 が認証プロセスを追跡してユーザーの本人確認を行うためのセッションが作成されます。このセッションは、この場合はブラウザーである認証端末と、Smart TV などの利用端末との間を橋渡しするために必要です。
次の図は、メール通知を使用したエンドツーエンドの CIBA フローを示しています。
以下のセクションでは、メール通知を使用した CIBA によるユーザー認証の仕組みを、手順に沿って詳しく説明します。
Auth0 を使用して CIBA のメールリクエストを開始するには、次の要件を満たしている必要があります。
ステップ 1: クライアントアプリケーションが CIBA リクエストを開始する
User Search APIs を使用して、CIBA リクエストを開始する対象の認可を行うユーザーを検索し、その user ID を取得します。
認可を行うユーザーの user ID を取得したら、Authentication API または SDKs を使用して、/bc-authorize エンドポイントに CIBA リクエストを送信します。
curl --location 'https://{YOUR_DOMAIN}.auth0.com/bc-authorize' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id={YOUR_CLIENT_ID}' \
--data-urlencode 'client_secret={YOUR_CLIENT_SECRET}' \
--data-urlencode 'login_hint={ "format": "iss_sub", "iss": "https://{YOUR_DOMAIN}.auth0.com/", "sub": "{USER_ID}" }' \
--data-urlencode 'scope={SCOPES}' \
--data-urlencode 'binding_message={BINDING_MESSAGE}'
var response = await authenticationApiClient . ClientInitiatedBackchannelAuthorization (
new ClientInitiatedBackchannelAuthorizationRequest ()
{
ClientId = "{YOUR_CLIENT_ID}" ,
Scope = "{SCOPES}" ,
ClientSecret = "{YOUR_CLIENT_SECRET}" ,
BindingMessage = "{BINDING_MESSAGE}" ,
LoginHint = new LoginHint ()
{
Format = "iss_sub" ,
Issuer = "https://{YOUR_DOMAIN}.auth0.com/" ,
Subject = "{USER_ID}"
}
}
);
resp , err := authAPI . CIBA . Initiate ( context . Background (), ciba . Request {
ClientID : mgmtClientID ,
ClientSecret : mgmtClientSecret ,
Scope : "openid" ,
LoginHint : map [ string ] string {
"format" : "iss_sub" ,
"iss" : "https://{YOUR_DOMAIN}.auth0.com/" ,
"sub" : "{USER_ID}" ,
},
BindingMessage : "{BINDING_MESSAGE}" ,
})
//AuthClient インスタンスを作成
AuthAPI auth = AuthAPI . newBuilder (domain, clientId, clientSecret). build ();
//認可を実行
Map < String , Object > loginHint = new HashMap <>();
loginHint . put ( "format" , "iss_sub" );
loginHint . put ( "iss" , "https://{YOUR_DOMAIN}.auth0.com/" );
loginHint . put ( "sub" , "{USER_ID}" );
Request < BackChannelAuthorizeResponse > request = auth . authorizeBackChannel ( "openid" , "{BINDING_MESSAGE}" , loginHint);
BackChannelAuthorizeResponse resp = request . execute (). getBody ();
パラメーター 説明 tenantテナント名です。カスタムドメインを指定することもできます。iss_sub 形式を使用する場合、テナント名は iss クレーム内で渡されます。 client_idクライアントアプリケーションの識別子です。 client_secretCIBA でユーザーを認証する際に使用するクライアント認証方法です。たとえば、クライアントシークレット、Private Key JWT、mTLS Authentication などがあります。Private Key JWT または mTLS を使用する場合は、クライアントシークレットを含める必要はありません。 scopeopenid を含める必要があります。 必要に応じて、リフレッシュトークンを要求するために offline_access を含めることもできます。ただし、CIBA フローでトランザクションを 1 回限り認可する場合、リフレッシュトークンは不要であり、このコンテキストでは意味を持ちません。user_idlogin_hint 構造内で渡される、認可を行うユーザーのユーザー ID です。iss_sub 形式を使用する場合、ユーザー ID は sub クレーム内で渡されます。 ユーザー ID の形式は、外部プロバイダーによって異なる場合があります。requested_expiryCIBA セッションの有効期間の上限 (秒単位) です。CIBA フローの要求有効期限は 1 ~ 259200 秒 (72 時間) で、デフォルトは 300 秒です。CIBA フローにカスタムの有効期限を設定するには、requested_expiry パラメーターを含めます。requested_expiry パラメーターは、CIBA が使用する通知チャネルの判定にも使われます。requested_expiry を 300 秒以下に設定すると、有効化されている場合、CIBA はモバイルプッシュ通知チャネルを使用します。テナントで MFA が設定されていない場合、CIBA リクエストは失敗します。requested_expiry を 301 ~ 259200 秒 (72 時間) に設定すると、有効化されている場合、CIBA はメール通知チャネルを使用します。 binding_message認証デバイスと利用デバイスの間で CIBA フローをひも付けるために使用される、人が読んで理解できるメッセージです。binding message は必須で、最大 64 文字です。使用できるのは英数字と +-_.,:# のみです。
認可を行うユーザーに送信できるリクエストは、ユーザー単位で 1 分あたり 5 件までに制限されています。
ステップ 2: Auth0 テナントが CIBA リクエストを受理する
Auth0 テナントが POST リクエストを正常に受信すると、そのリクエストを参照する auth-req-id を含むレスポンスが返されます。
{
"auth_req_id" : "eyJh..." ,
"expires_in" : 300 ,
"interval" : 5
}
auth_req_id 値は、CIBA フローの完了をポーリングで確認するために /token エンドポイントに渡されます。
ステップ 3: クライアントアプリケーションが応答をポーリングする
Authentication API または SDK を使用して、urn:openid:params:grant-type:ciba グラントタイプと /bc-authorize エンドポイントから受け取った auth_req_id を使って /token エンドポイントを呼び出します。
curl --location 'https://{YOUR_DOMAIN}.auth0.com/oauth/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id={YOUR_CLIENT_ID}' \
--data-urlencode 'client_secret={YOUR_CLIENT_SECRET}' \
--data-urlencode 'auth_req_id={AUTH_REQ_ID}' \
--data-urlencode 'grant_type=urn:openid:params:grant-type:ciba'
var token = await authenticationApiClient . GetTokenAsync (
new ClientInitiatedBackchannelAuthorizationTokenRequest ()
{
AuthRequestId = response . AuthRequestId ,
ClientId = "{YOUR_CLIENT_ID}" ,
ClientSecret = "{YOUR_CLIENT_SECRET}"
}
);
token , err := authAPI . OAuth . LoginWithGrant ( context . Background (),
"urn:openid:params:grant-type:ciba" ,
url . Values {
"auth_req_id" : [] string { resp . AuthReqID },
"client_id" : [] string { clientID },
"client_secret" : [] string { clientSecret },
},
oauth . IDTokenValidationOptions {})
Request < BackChannelTokenResponse > tokenRequest = auth . getBackChannelLoginStatus (authReqId, "grant-type" );
BackChannelTokenResponse tokenResponse = tokenRequest . execute (). getBody ();
認可を行うユーザーがトランザクションを承認するまでは、次の応答が返されます。
{
"error" : "authorization_pending" ,
"error_description" : "エンドユーザーの認証が保留中です"
}
ポーリングの待機間隔は約5秒です。ポーリングの頻度が高すぎると、次のレスポンスが返されます。このとき、description はバックオフ間隔に応じて異なります。
{
"error" : "slow_down" ,
"error_description" : "You are polling faster than allowed. Try again in 10 seconds."
"interval" : 10
}
このエラーを解消するには、次のポーリング間隔 (秒) が経過するまで待ってから、/token エンドポイントをポーリングしてください。
ステップ 4: Auth0 がユーザーのメールアドレスにリンクを送信する
Auth0 認可サーバーは、認可するユーザーのユーザー ID を含む login_hint を使用して、認証デバイスでのユーザー認証を開始します。
Auth0 認可サーバーは、ユーザーの確認済みメールアドレスにメールを送信します。
メールには、ユーザーが認証するためにクリックする必要がある確認リンクが含まれています。binding_message はリクエスト code として表示されます。
このリンクにより、/bc-verify エンドポイントへのリクエストを介してユーザーはブラウザーに移動し、そこで consent クエリパラメーターが同意待ちの CIBA リクエストを参照します。
アクティブなセッションが見つからない場合、確認リンクを開くとユーザーに認証が求められます。ユーザーはリンクをクリックして認証を進めます。
認証するには、ユーザーは確認済みのメールアドレスとパスワードを入力します。ユーザーは、クライアントアプリケーションが CIBA リクエストを開始する 際に /bc-authorize エンドポイントへ送信した login_hint パラメーターに対応する認証情報を使用する必要があります。そうしない場合は、エラーメッセージが表示されるため、ログアウトして再試行する必要があります。
標準的な login flow と同様に、CIBA のメールフローでも post-login Actions トリガーが実行されるため、お客様はアクセス制御ポリシーを適用したり、追加の MFA ファクターを要求したりするカスタムロジックを実装できます。CIBA の確認リンクから実行された場合、event.transaction.protocol の値は oidc-ciba-web-link になるため、この種類のログインに対して独自のルールを適用できます。詳細については、Login Trigger を参照してください。
認証が完了すると、ブラウザーには Auth0 Consent API による同意の詳細が表示されます。これには binding_message、scope、audience が含まれます。スコープは、RBAC ポリシーに従ってフィルタリングされます。詳しくは、ロールベースアクセス制御 を参照してください。
次のコードサンプルは、Auth0 Consent API からのレスポンス例です。
{
"id" : "cns_abc123" ,
"requested_details" : {
"audience" : "https://$tenant.auth0.com/userinfo" ,
"scope" : [ "openid" ],
"binding_message" : "21-49-38"
},
"created_at" : 1746693720
"expires_at" : 1746693750
}
この時点で、ユーザーは認証リクエストを承認するか拒否するかを選択できます。
ステップ 6: ブラウザーがユーザーの応答を Auth0 に返送する
ブラウザーはユーザーの応答を Auth0 に返送します。ユーザーが認証リクエストを受け入れるか拒否するかに応じて、Auth0 は次の同意画面を表示します。これらの画面は、同意プロンプトを設定する ことでカスタマイズする必要があります。
ステップ 7: フローの完了後、Auth0 はユーザーの応答を受信する
クライアントアプリケーションは、/token エンドポイントからの応答を受信すると、ポーリングを完了します。CIBA フローでは、認可を行うユーザーからの応答が常に必要であり、その内容は承認または拒否のいずれかです。既存のグラントは確認されません。
ステップ 8: Auth0 がクライアントアプリケーションにアクセストークンを返す
ユーザーがメールアドレスの提供リクエストを拒否した場合、Auth0 は次のようなエラーレスポンスをクライアントアプリケーションに返します。
{
"error" : "access_denied" ,
"error_description" : "エンドユーザーが認証リクエストを拒否したか、有効期限が切れました"
}
ユーザーがメールアドレスの提供リクエストを承認すると、Auth0 は次のような アクセストークン をクライアントアプリケーションに返します。
{
"access_token" : "eyJh..." ,
"id_token" : "eyJh..." ,
"expires_in" : 86400 ,
"scope" : "openid" ,
"token_type" : "Bearer"
}
refresh_token は、最初の /bc-authorize リクエストに offline_access スコープが含まれている場合にのみ返されます。