別の API からの API の呼び出し

開発者として、ある API が別の API を呼び出す必要がある場合にゼロ トラストを確認するにはどうすればよいですか? この記事では、ユーザーに代わって動作させるときに、アプリケーションを安全に開発する方法について説明します。

ユーザーがアプリの UI を操作する場合、アプリは委任されたアクセス許可を使用して、どのユーザーに代わってアプリが動作しているのかを認識する場合があります。 API の呼び出し時にアプリが提供するアクセス トークン内のサブジェクト (sub) 要求またはオブジェクト ID (oid) とテナント ID (tid) 要求を調べます。 API は信頼されていないアプリに依存しません。これは、ネットワーク上のどこかからの呼び出しにすぎません。 代わりに、トークンを確認して、Microsoft Entra ID が検証したアプリ ユーザーの代わりにのみ API が動作することを確認します。

ある API (元の API と呼ばれます) が別の API を呼び出すときは、呼び出す API (ダウンストリーム API と呼ばれます) が、上記の検証プロセスに従う必要があります。 ダウンストリーム API は、信頼されていないネットワーク ソースに依存できません。 適切に検証されたアクセス トークンからユーザー ID を取得する必要があります。

ダウンストリーム API が適切な検証プロセスに従わない場合、ダウンストリーム API は、別の方法でユーザーの ID を提供するために、元の API に依存する必要があります。 ダウンストリーム API は、アプリケーションのアクセス許可を誤って使用して操作を実行する可能性があります。 そうすると、元の API だけが、ダウンストリーム API に対してどのユーザーがどの結果を達成できるかについての権限を持つことになります。 元の API は、意図的に (または意図せず)、ユーザーが実行できなかったタスクをユーザーが実行できるようにする可能性があります。 たとえば、あるユーザーが別のユーザーの詳細を変更したり、ユーザーがアクセス許可を持っていないドキュメントの読み取りと更新を行ったりすることができます。 検証が正しくないと、重大なセキュリティの問題が発生する可能性があります。

セキュリティを強化するために、元の API は、元の API が呼び出しを行うときにダウンストリーム API に提供する委任されたアクセス許可のアクセス トークンを取得します。 この仕組みを見てみましょう。

クライアント アプリがアクセス トークンを取得して元の API を呼び出す

次のダイアグラムでは、左側にクライアント アプリと右側に元の API を示しています。

図は、左側に ID とアクセス トークンを持つクライアント アプリと、右側に承認が必要な元の API を示しています。

クライアント アプリケーションは、元の API への委任されたアクセス許可のアクセス トークン ("A" ラベルを持つ五角形の図形で示されます) を取得しました。 委任されたアクセス許可のアクセス トークンを使用すると、承認を必要とする元の API をユーザーに代わって呼び出すことができます。

クライアント アプリが元の API にアクセス トークンを付与する

次のアニメーションは、元の API にアクセス トークンを提供するクライアント アプリを示しています。 元の API は、アクセス トークンを完全に検証して検査し、クライアント アプリのユーザーの ID を判断します。

アニメーション化された図は、右側に承認が必要な元の API にアクセス トークンを与える左側のクライアント アプリを示しています。

アニメーション化されたダイアグラムは、1 番目のダイアグラムと 2 番目のダイアグラムの間のモーション遷移を伴う 2 つのダイアグラムを示しています。 最初のダイアグラムのタイトル: クライアント アプリは、元の API を呼び出すアクセス トークンを取得しました。 最初のダイアグラムのサブタイトル: クライアント アプリケーションには、元の API を呼び出すためにトークンで識別されたユーザーに代わって動作できるようにするアクセス 'A' トークンがあります。 最初のダイアグラム コンポーネント: クラウドの表現が、Microsoft Entra ID アイコンを囲むスライドの上部中央に表示されます。 左下の四角形は、クライアント アプリを表します。 クライアント アプリの四角形の下には、ID とアクセス トークンを表す "ID" と "A" というラベルが付いた 2 つの六角形の図形があります。 右下のキューブ型のアイコン、クラウド図形、ワールド アイコンが元の API を表します。 その左側には、正方形の図形ラベルが "認証が必要です" となっています。 左側の図形から右側の図形へ矢印で接続されています。 2 番目のダイアグラムのタイトル: クライアント アプリは、元の API へのアクセス トークンを提供します。 2 番目のダイアグラム コンポーネント: Microsoft Entra ID アイコンを囲むスライドの上部中央にクラウドの表現が表示されます。 左下の四角形は、クライアント アプリを表します。 クライアント アプリの四角形の下には、ID トークンを表す "ID" というラベルが付いた六角形の図形があります。 右下のキューブ型のアイコン、クラウド図形、ワールド アイコンが元の API を表します。 その左側には、正方形の図形ラベルが "認証が必要です" となっています。 左側には、アクセス トークンを表す "A" というラベルが付いた六角形の図形があります。 左側の図形から右側の図形へ矢印で接続されています。

元の API がトークンの検証と適用を実行する

次のアニメーションでは、クライアント アプリが元の API にアクセス トークンを付与した後、元の API がトークンの検証と適用を実行することを示しています。 すべて問題なければ、API が続行され、クライアント アプリの要求にサービスが提供されます。

アニメーション化された図は、右側の元の API にアクセス トークンを提供する ID トークンが左側にあるクライアント アプリを示しています。

アニメーション化されたダイアグラムは、1 番目のダイアグラムと 2 番目のダイアグラムの間のモーション遷移を伴う 2 つのダイアグラムを示しています。 最初のダイアグラムのタイトル: クライアント アプリは、元の API へのアクセス トークンを提供します。 最初のダイアグラム コンポーネント: クラウドの表現が、Microsoft Entra ID アイコンを囲むスライドの上部中央に表示されます。 左下の四角形は、クライアント アプリを表します。 クライアント アプリの四角形の下には、ID トークンを表す "ID" というラベルが付いた六角形の図形があります。 右下のキューブ型のアイコン、クラウド図形、ワールド アイコンが元の API を表します。 その左側には、正方形の図形ラベルが "認証が必要です" となっています。 左側には、アクセス トークンを表す "A" というラベルが付いた六角形の図形があります。 左側の図形から右側の図形へ矢印で接続されています。 2 番目のダイアグラムのタイトル: 元の API はトークンの検証と適用を実行します。 問題がなければ、API は要求を続行してサービスを提供します。 2 番目のダイアグラム コンポーネント: Microsoft Entra ID アイコンを囲むスライドの上部中央にクラウドの表現が表示されます。 左下の四角形は、クライアント アプリを表します。 クライアント アプリの四角形の下には、ID トークンを表す "ID" というラベルが付いた六角形の図形があります。 右下のキューブ型のアイコン、クラウド図形、ワールド アイコンが元の API を表します。 左側の図形から右側の図形へ矢印で接続されています。 矢印の上、右側、クラウド図形の下には、アクセス トークンを表す "A" というラベルが付いた六角形の図形があります。

元の API でアクセス トークンを使用してダウンストリーム API を呼び出すことはできません

次のアニメーションは、元の API がダウンストリーム API を呼び出すようになったことを示しています。 ただし、元の API では、アクセス トークンを使用してダウンストリーム API を呼び出すことはできません。

アニメーション化された図は、元の API にアクセス トークンを与えるクライアント アプリを示しています。承認が必要な場合、元の API がダウンストリーム API にトークンを渡さないようにします。

アニメーション化されたダイアグラムは、1 番目のダイアグラムと 2 番目のダイアグラムの間のモーション遷移を伴う 2 つのダイアグラムを示しています。 最初のダイアグラムのタイトル: 元の API はダウンストリーム API を呼び出したいと考えています。 最初のダイアグラム コンポーネント: クラウドの表現が、Microsoft Entra ID アイコンを囲むスライドの上部中央に表示されます。 左下の四角形は、クライアント アプリを表します。 クライアント アプリの四角形の下には、ID トークンを表す "ID" というラベルが付いた六角形の図形があります。 中央の下部のキューブ型のアイコン、クラウド図形、ワールド アイコンが元の API を表します。 矢印は、左側の図形を中央の図形に接続します。 矢印の上、左側、クラウド図形の下には、アクセス トークンを表す "A" というラベルが付いた六角形の図形があります。 2 番目のダイアグラムのタイトル: 元の API は、トークンを使用してダウンストリーム API を呼び出すことができません。 2 番目のダイアグラム コンポーネント: Microsoft Entra ID アイコンを囲むスライドの上部中央にクラウドの表現が表示されます。 左下の四角形は、クライアント アプリを表します。 クライアント アプリの四角形の下には、ID トークンを表す "ID" というラベルが付いた六角形の図形があります。 中央の下部のキューブ型のアイコン、クラウド図形、ワールド アイコンが元の API を表します。 矢印は、左側の図形を中央の図形に接続します。 矢印の上、左側、クラウド図形の下には、アクセス トークンを表す "A" というラベルが付いた六角形の図形があります。 右下のキューブ型のアイコン、クラウド図形、およびワールド アイコンがダウンストリーム API を表します。 その左側には、正方形の図形ラベルが "認証が必要です" となっています。 矢印は、中央の図形を右側の図形に接続します。

元の API が Microsoft Entra ID に戻る

次のアニメーションでは、元の API が Microsoft Entra ID に戻る必要があります。 ユーザーの代わりにダウンストリーム API を呼び出すには、アクセス トークンが必要です。

アニメーション化された図は、ダウンストリーム API を呼び出すために Microsoft Entra ID からの検証を必要とする元の API にアクセス トークンを提供するクライアント アプリを示しています。

アニメーション化されたダイアグラムは、1 番目のダイアグラムと 2 番目のダイアグラムの間のモーション遷移を伴う 2 つのダイアグラムを示しています。 最初のダイアグラムのタイトル: 元の API は、トークンを使用して、ダウンストリーム API を呼び出すことができません。 最初のダイアグラム コンポーネント: クラウドの表現が、Microsoft Entra ID アイコンを囲むスライドの上部中央に表示されます。 左下の四角形は、クライアント アプリを表します。 クライアント アプリの四角形の下には、ID トークンを表す "ID" というラベルが付いた六角形の図形があります。 中央の下部のキューブ型のアイコン、クラウド図形、ワールド アイコンが元の API を表します。 矢印は、左側の図形を中央の図形に接続します。 矢印の上、左側、クラウド図形の下には、アクセス トークンを表す "A" というラベルが付いた六角形の図形があります。 右下のキューブ型のアイコン、クラウド図形、およびワールド アイコンがダウンストリーム API を表します。 その左側には、正方形の図形ラベルが "認証が必要です" となっています。 矢印は、中央の図形を右側の図形に接続します。 2 番目のダイアグラムのタイトル: 元の API は Microsoft Entra ID に戻ります。 2 番目のダイアグラムのサブタイトル: ユーザーの代わりにダウンストリーム API を呼び出すにはアクセス トークンが必要です。 2 番目のダイアグラム コンポーネント: Microsoft Entra ID アイコンを囲むスライドの上部中央にクラウドの表現が表示されます。 左下の四角形は、クライアント アプリを表します。 クライアント アプリの四角形の下には、ID トークンを表す "ID" というラベルが付いた六角形の図形があります。 中央の下部のキューブ型のアイコン、クラウド図形、ワールド アイコンが元の API を表します。 矢印は、左側の図形を中央の図形に接続します。 矢印の上、左側、クラウド図形の下には、アクセス トークンを表す "A" というラベルが付いた六角形の図形があります。 元の API 図形の上の矢印が、それらを Microsoft Entra クラウド図形に接続します。 右下のキューブ型のアイコン、クラウド図形、およびワールド アイコンがダウンストリーム API を表します。 その左側には、正方形の図形ラベルが "認証が必要です" となっています。 矢印は、中央の図形を右側の図形に接続します。

次のアニメーションは、元の API がクライアント アプリから受信したトークンと、元の API のクライアント資格情報を提供する Original API を示しています。

アニメーション化された図は、ダウンストリーム API を呼び出すために Microsoft Entra ID から検証を受け取る元の API にアクセス トークンを与えるクライアント アプリを示しています。

アニメーション化されたダイアグラムは、1 番目のダイアグラムと 2 番目のダイアグラムの間のモーション遷移を伴う 2 つのダイアグラムを示しています。 最初のダイアグラムのタイトル: 元の API は Microsoft Entra ID に戻ります。 最初のダイアグラムのサブタイトル: ユーザーの代わりにダウンストリーム API を呼び出すにはアクセス トークンが必要です。 最初のダイアグラム コンポーネント: クラウドの表現が、Microsoft Entra ID アイコンを囲むスライドの上部中央に表示されます。 左下の四角形は、クライアント アプリを表します。 クライアント アプリの四角形の下には、ID トークンを表す "ID" というラベルが付いた六角形の図形があります。 中央の下部のキューブ型のアイコン、クラウド図形、ワールド アイコンが元の API を表します。 矢印は、左側の図形を中央の図形に接続します。 矢印の上、左側、クラウド図形の下には、アクセス トークンを表す "A" というラベルが付いた六角形の図形があります。 元の API 図形の上の矢印が、それらを Microsoft Entra クラウド図形に接続します。 右下のキューブ型のアイコン、クラウド図形、およびワールド アイコンがダウンストリーム API を表します。 その左側には、正方形の図形ラベルが "認証が必要です" となっています。 矢印は、中央の図形を右側の図形に接続します。 2 番目のダイアグラムのタイトル: 元の API は Microsoft Entra ID に戻ります。 2 番目のダイアグラムのサブタイトル: クライアント アプリからのトークンと、元の API の認証情報を提供します。 2 番目のダイアグラム コンポーネント: Microsoft Entra ID アイコンを囲むスライドの上部中央にクラウドの表現が表示されます。 左下の四角形は、クライアント アプリを表します。 クライアント アプリの四角形の下には、ID トークンを表す "ID" というラベルが付いた六角形の図形があります。 中央の下部のキューブ型のアイコン、クラウド図形、ワールド アイコンが元の API を表します。 矢印は、左側の図形を中央の図形に接続します。 元の API 図形の上の矢印が、それらを Microsoft Entra クラウド図形に接続します。 その矢印の左側のクラウド図形の左下には、アクセス トークンを表す "A" というラベルが付いた六角形の図形があります。 アクセス トークンの下にはキーシェイプがあります。 右下のキューブ型のアイコン、クラウド図形、およびワールド アイコンがダウンストリーム API を表します。 その左側には、正方形の図形ラベルが "認証が必要です" となっています。 矢印は、中央の図形を右側の図形に接続します。

Microsoft Entra ID は、同意や条件付きアクセスの強制などをチェックします。 呼び出し元のクライアントに戻り、トークンを取得できない理由を提供する必要がある場合があります。 通常は、クレーム チャレンジ プロセスを使用して、同意が受け取られないことに関する情報 (条件付きアクセス ポリシーに関連する情報など) を使用して呼び出し元アプリケーションに戻ります。

Microsoft Entra ID がチェックを実行する

次のアニメーションでは、Microsoft Entra ID はそのチェックを実行します。 問題がなければ、Microsoft Entra ID は元の API にアクセス トークンを発行して、ユーザーの代わりにダウンストリーム API を呼び出します。

アニメーション化された図は、Microsoft Entra ID を使用して検証した後、ダウンストリーム API にアクセス トークンを与える元の API を示しています。

アニメーション化されたダイアグラムは、1 番目のダイアグラムと 2 番目のダイアグラムの間のモーション遷移を伴う 2 つのダイアグラムを示しています。 最初のダイアグラムのタイトル: 元の API は Microsoft Entra ID に戻ります。 最初のダイアグラムのサブタイトル: クライアント アプリからのトークンと、元の API の認証情報を提供します。 最初のダイアグラム コンポーネント: クラウドの表現が、Microsoft Entra ID アイコンを囲むスライドの上部中央に表示されます。 左下の四角形は、クライアント アプリを表します。 クライアント アプリの四角形の下には、ID トークンを表す "ID" というラベルが付いた六角形の図形があります。 中央の下部のキューブ型のアイコン、クラウド図形、ワールド アイコンが元の API を表します。 矢印は、左側の図形を中央の図形に接続します。 元の API 図形の上の矢印が、それらを Microsoft Entra クラウド図形に接続します。 その矢印の左側のクラウド図形の左下には、アクセス トークンを表す "A" というラベルが付いた六角形の図形があります。 アクセス トークンの下にはキーシェイプがあります。 右下のキューブ型のアイコン、クラウド図形、およびワールド アイコンがダウンストリーム API を表します。 その左側には、正方形の図形ラベルが "認証が必要です" となっています。 矢印は、中央の図形を右側の図形に接続します。 2 番目のダイアグラムのタイトル: Microsoft Entra ID は条件付きアクセス、同意などをチェックします。2 番目のダイアグラムのサブタイトル: 元の API は、クライアント アプリにサインインしたユーザーに代わってダウンストリーム API を呼び出す独自のアクセス トークンを受信します。 2 番目のダイアグラム コンポーネント: Microsoft Entra ID アイコンを囲むスライドの上部中央にクラウドの表現が表示されます。 左下の四角形は、クライアント アプリを表します。 クライアント アプリの四角形の下には、ID トークンを表す "ID" というラベルが付いた六角形の図形があります。 中央の下部のキューブ型のアイコン、クラウド図形、ワールド アイコンが元の API を表します。 矢印は、左側の図形を中央の図形に接続します。 元の API 図形の上の矢印が、それらを Microsoft Entra クラウド図形に接続します。 右下のキューブ型のアイコン、クラウド図形、およびワールド アイコンがダウンストリーム API を表します。 その左側には、正方形の図形ラベルが "認証が必要です" となっています。 矢印は、中央の図形を右側の図形に接続します。 その矢印の上にある元の API 図形の右側には、アクセス トークンを表す "A" というラベルが付いた六角形の図形があります。

元の API には、On-Behalf-Of フローを含むユーザー コンテキストがある

次のアニメーションは、API がダウンストリーム API を呼び出す際にユーザー コンテキストを引き続き持つことができるようにする On-Behalf-Of フロー (OBO) プロセスを示しています。

アニメーション化された図は、ダウンストリーム API にアクセス トークンを与える元の API を示しています。

アニメーション化されたダイアグラムは、1 番目のダイアグラムと 2 番目のダイアグラムの間のモーション遷移を伴う 2 つのダイアグラムを示しています。 最初のダイアグラムのタイトル: On-Behalf-Of フロー プロセスでは、元の API がダウンストリーム API を呼び出す際に、引き続きユーザー コンテキストを持つことができます。 最初のダイアグラム コンポーネント: 左下の四角形の図形は、クライアント アプリを表します。 クライアント アプリの四角形の下には、ID トークンを表す "ID" というラベルが付いた六角形の図形があります。 中央の下部のキューブ型のアイコン、クラウド図形、ワールド アイコンが元の API を表します。 矢印は、左側の図形を中央の図形に接続します。 右下のキューブ型のアイコン、クラウド図形、およびワールド アイコンがダウンストリーム API を表します。 その左側には、正方形の図形ラベルが "認証が必要です" となっています。 矢印は、中央の図形を右側の図形に接続します。 その矢印の上にある元の API 図形の右側には、アクセス トークンを表す "A" というラベルが付いた六角形の図形があります。 2 番目のダイアグラムのタイトル: On-Behalf-Of フロー プロセスでは、元の API がダウンストリーム API を呼び出す元際に、引き続きユーザー コンテキストを持つことができます。 2 番目のダイアグラム コンポーネント: 左下のキューブ型のアイコン、クラウド図形、ワールド アイコンが元の API を表します。 右下のキューブ型のアイコン、クラウド図形、およびワールド アイコンがダウンストリーム API を表します。 その左側には、正方形の図形ラベルが "認証が必要です" となっています。 左側の図形から右側の図形へ矢印で接続されています。 その矢印の上にある元の API 図形の右側には、アクセス トークンを表す "A" というラベルが付いた六角形の図形があります。

元の API がダウンストリーム API を呼び出す

次のアニメーションでは、ダウンストリーム API を呼び出します。 ダウンストリーム API が受信するトークンには、ダウンストリーム API を示す適切なオーディエンス (aud) クレームがあります。

アニメーション化された図は、元の API からのアクセス トークンを検証するダウンストリーム API を示しています。

アニメーション化されたダイアグラムは、1 番目のダイアグラムと 2 番目のダイアグラムの間のモーション遷移を伴う 2 つのダイアグラムを示しています。 最初のダイアグラムのタイトル: On-Behalf-Of フロー プロセスでは、元の API がダウンストリーム API を呼び出す際に、引き続きユーザー コンテキストを持つことができます。 最初のダイアグラム コンポーネント: 左下のキューブ型のアイコン、クラウド図形、ワールド アイコンが元の API を表します。 右下のキューブ型のアイコン、クラウド図形、およびワールド アイコンがダウンストリーム API を表します。 その左側には、正方形の図形ラベルが "認証が必要です" となっています。 左側の図形から右側の図形へ矢印で接続されています。 その矢印の上にある元の API 図形の右側には、アクセス トークンを表す "A" というラベルが付いた六角形の図形があります。 2 番目のダイアグラムのタイトル: ダウンストリーム API が呼び出されます。 2 番目のダイアグラムのサブタイトル: ダウンストリーム API が受信するトークンには、クライアント アプリのユーザーを識別するための適切な要求があります。 2 番目のダイアグラム コンポーネント: 左下のキューブ型のアイコン、クラウド図形、ワールド アイコンが元の API を表します。 右下のキューブ型のアイコン、クラウド図形、およびワールド アイコンがダウンストリーム API を表します。 その左側には、正方形の図形ラベルが "認証が必要です" となっています。 左側の図形から右側の図形へ矢印で接続されています。 その矢印の上にある認証が必要な図形の左側には、アクセス トークンを表す "A" というラベルの付いた六角形の図形があります。

トークンには、許可された同意のスコープと、元のアプリ ユーザー ID が含まれます。 ダウンストリーム API は、有効なアクセス許可を適切に実装して、識別されたユーザーが要求されたタスクを実行するためのアクセス許可を持っていることを確認できます。 On-Behalf-Of フローを使用して、ある API が別の API を呼び出すためのトークンを取得して、ユーザー コンテキストがすべてのダウンストリーム API に確実に渡されるようにします。

最適なオプション: 元の API が On-Behalf-Of フローを実行する

この最後のアニメーションは、元の API が On-Behalf-Of フロー (OBO) を実行することが最適なオプションであることを示しています。 ダウンストリーム API が正しいトークンを受信すると、正しく応答できるようになります。

アニメーション化された図は、元の API からアクセス トークンを受け取るダウンストリーム API を示しています。

アニメーション化されたダイアグラムは、1 番目のダイアグラムと 2 番目のダイアグラムの間のモーション遷移を伴う 2 つのダイアグラムを示しています。 最初のダイアグラムのタイトル: ダウンストリーム API が呼び出されます。 最初のダイアグラムのサブタイトル: ダウンストリーム API が受信するトークンには、クライアント アプリのユーザーを識別するための適切な要求があります。 最初のダイアグラム コンポーネント: 左下のキューブ型のアイコン、クラウド図形、ワールド アイコンが元の API を表します。 右下のキューブ型のアイコン、クラウド図形、およびワールド アイコンがダウンストリーム API を表します。 その左側には、正方形の図形ラベルが "認証が必要です" となっています。 左側の図形から右側の図形へ矢印で接続されています。 その矢印の上にある認証が必要な図形の左側には、アクセス トークンを表す "A" というラベルの付いた六角形の図形があります。 2 番目のダイアグラムのタイトル: 最適なオプションは、元の API が "On-Behalf-Of フロー" を実行することです。 ダウンストリーム API が正しいトークンを受信すると、正しく応答できるようになります。 2 番目のダイアグラム コンポーネント: 左下のキューブ型のアイコン、クラウド図形、ワールド アイコンが元の API を表します。 右下のキューブ型のアイコン、クラウド図形、およびワールド アイコンがダウンストリーム API を表します。 左側の図形から右側の図形へ矢印で接続されています。 その矢印の上にあるダウンストリーム API 図形の左側には、アクセス トークンを表す "A" というラベルが付いた六角形の図形があります。

API がユーザーに代わって動作していて、別の API を呼び出す必要がある場合、API は OBO を使用して委任されたアクセス許可アクセス トークンを取得し、ユーザーの代わりにダウンストリーム API を呼び出す必要があります。 API がユーザーに代わって動作している場合、API はアプリケーションのアクセス許可を使用してダウンストリーム API を呼び出してはいけません。

次のステップ