次の方法で共有


Azure Active Directory B2C での OAuth 2.0 承認コード フロー

重要

2025 年 5 月 1 日より、Azure AD B2C は新規のお客様向けに購入できなくなります。 詳細については、FAQ を参照してください

デバイスにインストールされているアプリで OAuth 2.0 認証コード付与を使用して、Web API などの保護されたリソースにアクセスできます。 OAuth 2.0 の Azure Active Directory B2C (Azure AD B2C) 実装を使用すると、シングルページ、モバイル、デスクトップ アプリにサインアップ、サインイン、その他の ID 管理タスクを追加できます。 この記事では、オープンソース ライブラリを使用せずに HTTP メッセージを送受信する方法について説明します。 この記事は言語に依存しません。 可能であれば、サポートされている Microsoft 認証ライブラリ (MSAL) を使用することをお勧めします。 MSAL を使用するサンプル アプリを見てみましょう。

OAuth 2.0 承認コード フローは、 OAuth 2.0 仕様のセクション 4.1で規定されています。 Web アプリケーション、シングルページ アプリケーション、ネイティブにインストールされたアプリケーションなど、ほとんどの アプリケーションの種類で認証と承認に使用できます。 OAuth 2.0 承認コード フローを使用して、アプリケーションのアクセス トークンと更新トークンを安全に取得できます。これを使用して、 承認サーバーによってセキュリティ保護されたリソースにアクセスできます。 更新トークンを使用すると、通常は 1 時間後にアクセス トークンの有効期限が切れると、クライアントは新しいアクセス (および更新) トークンを取得できます。

この記事では、 パブリック クライアント の OAuth 2.0 承認コード フローについて説明します。 パブリック クライアントは、シークレット パスワードの整合性を安全に維持するために信頼できない任意のクライアント アプリケーションです。 これには、シングルページ アプリケーション、モバイル アプリ、デスクトップ アプリケーション、および基本的にサーバー上で実行されないすべてのアプリケーションが含まれます。

Azure AD B2C を使用して Web アプリに ID 管理を追加するには、OAuth 2.0 ではなく OpenID Connect を使用します。

Azure AD B2C では、標準の OAuth 2.0 フローが拡張され、単純な認証と承認以上の処理が行われます。 ユーザー フローについて説明します。 ユーザー フローでは、OAuth 2.0 を使用して、サインアップ、サインイン、プロファイル管理などのユーザー エクスペリエンスをアプリケーションに追加できます。 OAuth 2.0 プロトコルを使用する ID プロバイダーには、 AmazonMicrosoft Entra IDFacebookGitHubGoogleLinkedIn が含まれます。

この記事の HTTP 要求を試すには:

  1. {tenant}を Azure AD B2C テナントの名前に置き換えます。
  2. 00001111-aaaa-2222-bbbb-3333cccc4444を、以前に Azure AD B2C テナントに登録したアプリケーションのアプリ ID に置き換えます。
  3. {policy}は、テナントで作成したポリシーの名前 (b2c_1_sign_inなど) に置き換えます。

シングルページ アプリに必要なリダイレクト URI のセットアップ

シングル ページ アプリケーションの承認コード フローには、追加のセットアップが必要です。 シングルページ アプリケーションを作成する手順に従って、リダイレクト URI を CORS に対して有効として正しくマークします。 CORS を有効にするために既存のリダイレクト URI を更新するには、[アプリの登録] の [認証] タブの [Web] セクションで移行プロンプトをクリックします。または、アプリ登録マニフェスト エディターを開き、リダイレクト URI の type フィールドを spa セクションでreplyUrlsWithTypeに設定することもできます。

spa リダイレクトの種類は、暗黙のフローと後方互換性があります。 トークンを取得するために暗黙的なフローを現在使用しているアプリは、問題なく spa のリダイレクト URI の種類に移行し、暗黙的なフローを引き続き使用することができます。

1. 承認コードを取得する

承認コード フローは、クライアントがユーザーを /authorize エンドポイントにリダイレクトさせることから始まります。 これは、ユーザーがアクションを実行するフローの対話型部分です。 この要求では、クライアントは scope パラメーターで、ユーザーから取得する必要があるアクセス許可を示します。 次の例 (読みやすくするために改行を含む) は、承認コードを取得する方法を示しています。 この GET HTTP 要求をテストする場合は、ブラウザーを使用します。

GET https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{policy}/oauth2/v2.0/authorize?
client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&response_type=code
&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob
&response_mode=query
&scope=00001111-aaaa-2222-bbbb-3333cccc4444%20offline_access%20https://{tenant-name}/{app-id-uri}/{scope}
&state=arbitrary_data_you_can_receive_in_the_response
&code_challenge=YTFjNjI1OWYzMzA3MTI4ZDY2Njg5M2RkNmVjNDE5YmEyZGRhOGYyM2IzNjdmZWFhMTQ1ODg3NDcxY2Nl
&code_challenge_method=S256
パラメーター 必須ですか? 説明
{賃借人} 必須 Azure AD B2C テナントの名前。
{ポリシー} 必須 実行するユーザー フロー。 Azure AD B2C テナントで作成したユーザー フローの名前を指定します。 例えば: b2c_1_sign_inb2c_1_sign_up、またはb2c_1_edit_profile
クライアントID 必須 Azure Portal でアプリに割り当てられたアプリケーション ID。
レスポンス・タイプ (response_type) 必須 応答の種類。承認コード フローでは code を指定する必要があります。 ID トークンが応答の種類 (code+id_tokenなど) に含まれる場合、そのトークンを受け取ることができます。この場合は、スコープに openid を含める必要があります。
redirect_uri 必須 アプリのリダイレクト URI。アプリは、この URI で認証応答を送受信します。 ポータルで登録したいずれかのリダイレクト URI と完全に一致させる必要があります (ただし、URL エンコードが必要)。
範囲 必須 スコープのスペースで区切られた一覧。 openid スコープは、ユーザーをサインインさせ、ID トークンの形式でユーザーに関するデータを取得するためのアクセス許可を示します。 Web アプリケーションの場合、offline_access スコープは任意です。 これは、アプリケーションがリソースへの拡張アクセスに 更新トークン を必要としていることを示します。 クライアント ID は、発行されたトークンが Azure AD B2C の登録済みクライアントで使うためのものであることを示しています。 https://{tenant-name}/{app-id-uri}/{scope} は、保護されたリソース (Web API など) に対するアクセス許可を示します。 詳細については、アクセス トークンの要求に関する記事を参照してください。
response_mode (レスポンス モード) 推奨 結果として得られた承認コードをアプリに返すときに使用するメソッド。 queryform_post、または fragment を指定できます。
状態 推奨 要求に含まれる値。使用したい任意の内容の文字列を指定できます。 通常、クロスサイト リクエスト フォージェリ攻撃を防ぐために、ランダムに生成された一意の値が使用されます。 この状態は、認証要求の前にアプリ内のユーザーの状態に関する情報をエンコードする目的にも使用されます。 たとえば、ユーザーが表示していたページや実行されていたユーザー フローがその対象です。
プロンプト オプション 必要なユーザー操作の種類。 現在、有効な値は login のみです。この値により、ユーザーはその要求に対して資格情報の入力を強制されます。 シングル サインオンは有効になりません。
コードチャレンジ 推奨/必須 Proof Key for Code Exchange (PKCE) を使用して承認コード付与をセキュリティで保護するために使用されます。 code_challenge_method が含まれている場合は必須です。 code_verifiercode_challengeを生成するには、アプリケーションにロジックを追加する必要があります。 code_challengeは、code_verifierの Base64 URL エンコード SHA256 ハッシュです。 後で使用するためにアプリケーションに code_verifier を格納し、承認要求と共に code_challenge を送信します。 詳細については、「PKCE RFC」を参照してください。 これは、すべてのアプリケーションの種類 (ネイティブ アプリ、SPA、Web アプリなどの機密クライアント) に推奨されるようになりました。
code_challenge_method 推奨/必須 code_verifier パラメーターの code_challenge をエンコードするために使用されるメソッド。 これは である "べき" ですが、何らかの理由によってクライアントで SHA256 がサポートされない場合、仕様では S256 の使用が許可されています。plain

code_challenge_methodを除外してもcode_challengeを含める場合、code_challengeはプレーンテキストと見なされます。 Microsoft ID プラットフォームでは、 plainS256の両方がサポートされています。 詳細については、「PKCE RFC」を参照してください。 これは、 承認コード フローを使用するシングル ページ アプリに必要です。
ログインヒント (login_hint) いいえ サインイン ページのサインイン名フィールドに事前に入力するために使用できます。 詳細については、「サインイン名を事前入力する」を参照してください。
ドメインヒント いいえ サインインに使用する必要があるソーシャル ID プロバイダーに関するヒントを Azure AD B2C に提供します。 有効な値が含まれている場合、ユーザーは直接 ID プロバイダーのサインイン ページに移動します。 詳細については、「サインインをソーシャル プロバイダーにリダイレクトする」を参照してください。
カスタム パラメーター いいえ カスタム ポリシーで使用できるカスタム パラメーター。 たとえば、動的なカスタム ページ コンテンツ URIキー値要求リゾルバーなどです。

この時点で、ユーザーはユーザー フローのワークフローを完了するように求められます。 これには、ユーザーがユーザー名とパスワードを入力したり、ソーシャル ID でサインインしたり、ディレクトリにサインアップしたり、その他の数の手順を実行したりする必要があります。 ユーザー アクションは、ユーザー フローの定義方法によって異なります。

ユーザーがユーザー フローを完了すると、Microsoft Entra ID は、 redirect_uriに使用した値でアプリへの応答を返します。 response_mode パラメーターで指定されたメソッドを使用します。 応答は、実行されたユーザー フローとは無関係に、各ユーザー アクション シナリオでまったく同じです。

response_mode=queryを使用する正常な応答は次のようになります。

GET urn:ietf:wg:oauth:2.0:oob?
code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq...        // the authorization_code, truncated
&state=arbitrary_data_you_can_receive_in_the_response                // the value provided in the request
パラメーター 説明
コード アプリが要求した承認コード。 アプリでは、承認コードを使用して、ターゲット リソースのアクセス トークンを要求できます。 承認コードは有効期間が短くなります。 通常、約 10 分で期限が切れます。
状態 前のセクションの表の完全な説明を参照してください。 要求に state パラメーターが含まれている場合、同じ値が応答にも含まれることになります。 アプリは、要求と応答の state 値が同じであることを確認する必要があります。

エラー応答をリダイレクト URI に送信して、アプリが適切に処理できるようにすることもできます。

GET urn:ietf:wg:oauth:2.0:oob?
error=access_denied
&error_description=The+user+has+cancelled+entering+self-asserted+information
&state=arbitrary_data_you_can_receive_in_the_response
パラメーター 説明
エラー 発生するエラーの種類を分類するために使用できるエラー コード文字列。 文字列を使用してエラーに対応することもできます。
エラーの説明 認証エラーの根本的な原因を特定しやすいように記述した具体的なエラー メッセージ。
状態 前の表の完全な説明を参照してください。 要求に state パラメーターが含まれている場合、同じ値が応答にも含まれることになります。 アプリは、要求と応答の state 値が同じであることを確認する必要があります。

2. アクセス トークンを取得する

承認コードを取得したので、code エンドポイントに POST 要求を送信することで、目的のリソースへのトークンの/tokenを引き換えることができます。 Azure AD B2C では、対応するスコープを要求の中で指定することによって、いつものように他の API のアクセス トークンを要求できます。

アプリのクライアント ID を要求されたスコープとして使用する規則によって、アプリ独自のバックエンド Web API のアクセス トークンを要求することもできます (その結果、そのクライアント ID を "対象ユーザー" として持つアクセス トークンになります)。

POST https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{policy}/oauth2/v2.0/token HTTP/1.1

Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&scope=00001111-aaaa-2222-bbbb-3333cccc4444 offline_access
&code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq...
&redirect_uri=urn:ietf:wg:oauth:2.0:oob
&code_verifier=ThisIsntRandomButItNeedsToBe43CharactersLong 
パラメーター 必須ですか? 説明
{賃借人} 必須 Azure AD B2C テナントの名前。
{ポリシー} 必須 認証コードの取得に使用されたユーザー フロー。 この要求に別のユーザー フローを使用することはできません。
クライアントID 必須 Azure Portal でアプリに割り当てられたアプリケーション ID。
クライアントシークレット はい (Web アプリの場合) Azure portal で生成されたアプリケーション シークレット。 クライアントが安全にクライアント シークレットを格納できる Web アプリのシナリオでは、このフローでクライアント シークレットが使用されます。 ネイティブ アプリ (パブリック クライアント) のシナリオでは、クライアント シークレットを安全に格納できないため、この呼び出しでは使用されません。 クライアント シークレットを使用する場合は、定期的に変更します。
grant_type(グラントタイプ) 必須 助成金の種類。 承認コード フローでは、許可の種類を authorization_codeする必要があります。
範囲 推奨 スコープのスペースで区切られた一覧。 1 つのスコープ値は、要求されている両方のアクセス許可を Azure AD B2C に示します。 スコープとしてクライアント ID を使用すると、同じクライアント ID で表される独自のサービスまたは Web API に対して使用できるアクセス トークンがアプリに必要であることが示されます。 offline_accessスコープは、アプリでリソースへの有効期間が長いアクセスに更新トークンが必要であることを示します。 openid スコープを使用して、Azure AD B2C に ID トークンを要求することもできます。
コード 必須 /authorize エンドポイントから取得した承認コード。
redirect_uri 必須 承認コードを受け取ったアプリケーションのリダイレクト URI。
コード検証器 推奨 承認コードの取得に使用されるのと同じ code_verifier 。 承認コード付与要求で PKCE が使用された場合は必須です。 詳細については、「PKCE RFC」を参照してください。

この POST HTTP 要求をテストする場合は、 Microsoft PowerShell などの任意の HTTP クライアントを使用できます。

成功したトークン応答は次のようになります。

{
    "not_before": "1442340812",
    "token_type": "Bearer",
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...",
    "scope": "00001111-aaaa-2222-bbbb-3333cccc4444 offline_access",
    "expires_in": "3600",
    "refresh_token": "AAQfQmvuDy8WtUv-sd0TBwWVQs1rC-Lfxa_NDkLqpg50Cxp5Dxj0VPF1mx2Z...",
}
パラメーター 説明
以前にはない トークンが有効と見なされる時刻 (エポック時間)。
トークンタイプ トークン タイプ値。 Microsoft Entra ID でサポートされる種類はベアラーのみです。
アクセス トークン 要求した署名済み JSON Web トークン (JWT)。
範囲 トークンが有効なスコープ。 後で使用するために、スコープを使用してトークンをキャッシュすることもできます。
有効期限 トークンが有効な時間の長さ (秒単位)。
リフレッシュ トークン (refresh_token) OAuth 2.0 の更新トークン。 アプリでは、このトークンを使用して、現在のトークンの有効期限が切れた後に追加のトークンを取得できます。 更新トークンは長時間使用されます。 これらを使用して、リソースへのアクセスを長期間保持できます。 詳細については、 Azure AD B2C トークン リファレンスを参照してください

エラー応答は次のようになります。

{
    "error": "access_denied",
    "error_description": "The user revoked access to the app.",
}
パラメーター 説明
エラー 発生するエラーの種類を分類するために使用できるエラー コード文字列。 文字列を使用してエラーに対応することもできます。
エラーの説明 認証エラーの根本的な原因を特定しやすいように記述した具体的なエラー メッセージ。

3. トークンを使用する

アクセス トークンが正常に取得されたので、バックエンド Web API への要求でトークンを Authorization ヘッダーに含めることで使用できます。

GET /tasks
Host: mytaskwebapi.com
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...

4. トークンを更新する

アクセス トークンと ID トークンの有効期限は非常に短いです。 有効期限が切れた後に、リソースに引き続きアクセスできるようにするには、トークンを更新する必要があります。 アクセス トークンを更新すると、Azure AD B2C から新しいトークンが返されます。 更新されたアクセス トークンは、nbf (期間の開始時刻)、iat (発行時刻)、および exp (有効期限) の要求値が更新されます。 他のすべての要求値は、最初に発行されたアクセス トークンと同じです。

トークンを更新するには、 /token エンドポイントに別の POST 要求を送信します。 今回は、refresh_tokenの代わりにcodeを指定します。

POST https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{policy}/oauth2/v2.0/token HTTP/1.1

Content-Type: application/x-www-form-urlencoded

grant_type=refresh_token
&client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&scope=00001111-aaaa-2222-bbbb-3333cccc4444 offline_access
&refresh_token=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq...
&redirect_uri=urn:ietf:wg:oauth:2.0:oob
パラメーター 必須ですか? 説明
{賃借人} 必須 Azure AD B2C テナントの名前。
{ポリシー} 必須 元の更新トークンの取得に使用されたユーザー フロー。 この要求に別のユーザー フローを使用することはできません。
クライアントID 必須 Azure Portal でアプリに割り当てられたアプリケーション ID。
クライアントシークレット はい (Web アプリの場合) Azure portal で生成されたアプリケーション シークレット。 クライアントが安全にクライアント シークレットを格納できる Web アプリのシナリオでは、このフローでクライアント シークレットが使用されます。 ネイティブ アプリ (パブリック クライアント) のシナリオでは、クライアント シークレットを安全に格納できないため、この呼び出しでは使用されません。 クライアント シークレットを使用する場合は、定期的に変更してください。
grant_type(グラントタイプ) 必須 助成金の種類。 承認コード フローのこの区間では、許可の種類を refresh_tokenする必要があります。
範囲 推奨 スコープのスペースで区切られた一覧。 1 つのスコープ値は、要求されている両方のアクセス許可を Microsoft Entra ID に示します。 スコープとしてクライアント ID を使用すると、同じクライアント ID で表される独自のサービスまたは Web API に対して使用できるアクセス トークンがアプリに必要であることが示されます。 offline_accessスコープは、アプリでリソースへの有効期間が長いアクセスに更新トークンが必要であることを示します。 openid スコープを使用して、Azure AD B2C に ID トークンを要求することもできます。
redirect_uri オプション 承認コードを受け取ったアプリケーションのリダイレクト URI。
リフレッシュ トークン (refresh_token) 必須 フローの第 2 段階で取得した元の更新トークン。

成功したトークン応答は次のようになります。

{
    "not_before": "1442340812",
    "token_type": "Bearer",
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...",
    "scope": "00001111-aaaa-2222-bbbb-3333cccc4444 offline_access",
    "expires_in": "3600",
    "refresh_token": "AAQfQmvuDy8WtUv-sd0TBwWVQs1rC-Lfxa_NDkLqpg50Cxp5Dxj0VPF1mx2Z...",
}
パラメーター 説明
以前にはない トークンが有効と見なされる時刻 (エポック時間)。
トークンタイプ トークン タイプ値。 Microsoft Entra ID でサポートされる種類はベアラーのみです。
アクセス トークン 要求した署名付きの JWT。
範囲 トークンが有効なスコープ。 後で使用するために、スコープを使用してトークンをキャッシュすることもできます。
有効期限 トークンが有効な時間の長さ (秒単位)。
リフレッシュ トークン (refresh_token) OAuth 2.0 の更新トークン。 アプリでは、このトークンを使用して、現在のトークンの有効期限が切れた後に追加のトークンを取得できます。 更新トークンは有効期間が長く、リソースへのアクセスを長期間保持するために使用できます。 詳細については、 Azure AD B2C トークン リファレンスを参照してください

エラー応答は次のようになります。

{
    "error": "access_denied",
    "error_description": "The user revoked access to the app.",
}
パラメーター 説明
エラー 発生するエラーの種類を分類するために使用できるエラー コード文字列。 文字列を使用してエラーに対応することもできます。
エラーの説明 認証エラーの根本的な原因を特定しやすいように記述した具体的なエラー メッセージ。

独自の Azure AD B2C ディレクトリを使用する

これらの要求を自分で試すには、次の手順を実行します。 この記事で使用した値の例を独自の値に置き換えます。

  1. Azure AD B2C ディレクトリを作成します。 要求でディレクトリの名前を使用します。
  2. アプリケーション ID とリダイレクト URI を取得するアプリケーションを作成します。 アプリにネイティブ クライアントを含めます。
  3. ユーザー フローを作成 して、ユーザー フロー名を取得します。