このページは Apigee と Apigee ハイブリッドに適用されます。
Apigee Edge のドキュメントを表示する。
認証コードは、最もよく使用される OAuth 2.0 権限付与タイプの 1 つです。認証コードフローは 3-legged OAuth 構成です。この構成では、ユーザーはリソース サーバーで自分自身を認証して、保護されたリソースにアクセスする許可をアプリに与えます。クライアント アプリにユーザー名 / パスワードを提供する必要はありません。
このトピックについて
このトピックでは、OAuth 2.0 認証権限付与タイプのフローの一般的な説明と概要を示し、Apigee でこのフローを実装する方法について説明します。
動画
OAuth 2.0 認証権限付与タイプを使用して API を保護する方法については、こちらの短い動画をご覧ください。
ユースケース
この権限付与タイプは、API プロバイダと信頼できるビジネス関係を築いていないサードパーティ デベロッパーが作成したアプリに使用します。たとえば、パブリック API プログラムに登録しているデベロッパーは、一般的には信頼しないようにする必要があります。この権限付与タイプでは、リソース サーバー上のユーザー認証情報がアプリと共有されることはありません。
コードサンプル
Apigee 上で機能する認証コード権限付与タイプの完全な実装サンプルは、GitHub の api-platform-samples
リポジトリにあります。api-platform-samples/sample-proxies ディレクトリの oauth-advanced サンプルをご覧ください。サンプルの詳細については、README ファイルをご覧ください。
フロー図
次のフロー図は、Apigee が認可サーバーとして機能する認証コードの OAuth フローを示しています。
認証コードフローの手順
以下に、Apigee が認可サーバーとして機能する認証コード権限付与タイプを実装するために必要な手順の概要を示します。このフローの鍵となるのは、クライアントがリソース サーバー上のユーザー認証情報を見ることはないということです。
前提条件: クライアント アプリを Apigee に登録して、クライアント ID とクライアント シークレット キーを取得する必要があります。詳細については、クライアント アプリの登録をご覧ください。
1. ユーザーがフローを開始する
アプリがリソース サーバーからユーザーの保護されたリソース(ソーシャル メディア サイトの連絡先リストなど)にアクセスする必要がある場合、アプリは、API 呼び出しを Apigee に送信し、Apigee がクライアント ID を検証します。クライアント ID が有効な場合は、ユーザーのブラウザがログインページにリダイレクトされて、そこでユーザーが認証情報を入力します。API 呼び出しには、クライアント アプリの登録時に取得した情報(クライアント ID とリダイレクト URI)が含まれています。
2. ユーザーが認証情報を入力する
ログインページが表示され、ログイン認証情報の入力を求められます。ログインに成功したら、次のステップに進みます。
3. ユーザーが同意する
このステップで、ユーザーは自分のリソースにアプリがアクセスすることに同意します。通常、同意フォームにはスコープの選択が含まれており、リソース サーバーでアプリに許可する操作を選択できます。たとえば、読み取り専用の権限や、アプリがリソースを更新する権限を与えることができます。
4. ログインアプリが Apigee にリクエストを送信する
ログインと同意が完了すると、ログインアプリは Apigee の /authorizationcode エンドポイントにデータを POST します。データには、リダイレクト URI、クライアント ID、スコープ、ユーザー固有の情報、ログインに成功したことを示す情報が含まれます。
5. Apigee が認証コードを生成する
Apigee が /authorizationcode エンドポイント上のログインアプリから GET リクエストを受け取ると、次の 2 つのことが発生します。まず、Apigee はログインが成功したと判断します(HTTP ステータスの確認やその他の手段から判断します)。次に、Apigee はログインアプリから送信されたリダイレクト URI が、Apigee へのアプリ登録時に指定されたリダイレクト URI と一致していることを確認します。すべて問題なければ、Apigee が認証コードを生成します。次に例を示します。
http://myorg-test.apigee.net/oauth/authorizationcode?client_id={consumer_key}&response_type=code&redirect_uri={redirect_uri}&scope=scope1%20scope2&state={some_string}
6. Apigee がクライアントに認証コードを返送する
Apigee は、クエリ パラメータとしてアタッチされた認証コードとともにクライアントに 302 リダイレクトを送信します。
7. クライアントが認証コードを取得し、Apigee にアクセスコードをリクエストする
クライアントは、有効な認証コードを使用して Apigee にアクセス トークンをリクエストできます。クライアント ID とクライアント シークレット キー(アプリが Apigee に登録されたときに取得されたもの)、権限付与タイプ、スコープを POST してリクエストします。クライアント ID とシークレット キーを含めることで、Apigee はクライアント アプリが登録済みのものであることを確認できます。次に例を示します。
$ curl https://{org_name}-test.apigee.net/my_oauth_proxy/accesstoken?code=Xyz123&grant_type=authorization_code -X POST -d 'client_id=bBGAQrXgivA9lKu7NMPyoYpKNhGar6K&client_secret=hAr4GngA9vAyvI4'
8. クライアントがアクセス トークンを受け取る
すべてが正常に完了すると、Apigee はアクセス トークンをクライアントに返します。アクセス トークンには有効期限があり、ユーザーがアプリにリソースへのアクセスを許可したときに指定したスコープでのみ有効です。
9. 保護された API をクライアントが呼び出す
ここで、有効なアクセスコードを使って、クライアントは保護された API を呼び出すことができます。このシナリオでは、Apigee(プロキシ)にリクエストが行われ、Apigee はターゲット リソース サーバーに API 呼び出しを渡す前にアクセス トークンを検証します。アクセス トークンは認証ヘッダーで渡されます。次に例を示します。
$ curl -H "Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z" http://{org_name}-test.apigee.net/weather/forecastrss?w=12797282
フローとポリシーを構成する
Apigee は、認可サーバーとしてアクセス トークン、認証コード、更新トークン、ログインページのリダイレクトなど、多数の OAuth リクエストを処理する必要があります。これらのエンドポイントを構成する基本的な手順は次の 2 つです。
- カスタムフローの作成
- OAuthV2 ポリシーの追加と構成
カスタムフローの構成
通常、この権限付与タイプのフローでは、フローの各ステップまたは区間が Apigee プロキシのフローによって定義されるように構成します。各フローには、認証コードやアクセス トークンの生成など OAuth 固有のタスクを実行するエンドポイントとポリシーがあります。たとえば、以下の XML に示すように、/oauth/authorizationcode
エンドポイントには GenerateAuthCode という関連ポリシー(GenerateAuthorizationCode オペレーションが指定されている OAuthV2 ポリシー)があります。
フロー構成を表示する最も簡単な方法は、XML の例を使用することです。各フローの詳細については、インライン コメントをご覧ください。これは一例です。必要に応じてフローとパスの名前を構成できます。このようなカスタムフローを作成するために必要な手順の概要については、OAuth のエンドポイントとポリシーの構成をご覧ください。
GitHub の実装例もご覧ください。
<Flows>
<Flow name="RedirectToLoginApp">
<!--
Publish this URI to developers to use for their 'login' link
-->
<Condition>proxy.pathsuffix == "/oauth/authorize"</Condition>
<Request>
<Step><Name>RedirectToLoginPage</Name></Step>
</Request>
</Flow>
<Flow name="GetAuthCode">
<!--
Call this URL from your Login app after you authenticate the user.
The policy will automatically return the auth code in the response to the
redirect_uri registered by the calling app
-->
<Condition>proxy.pathsuffix == "/oauth/authorizationcode"</Condition>
<Request>
<Step><Name>GenerateAuthCode</Name></Step>
</Request>
</Flow>
<Flow name="GetAccessToken">
<!-- This policy flow is triggered when the URI path suffix
matches /oauth/accesstoken. Publish this URL to app developers
to use when obtaining an access token using an auth code
-->
<Condition>proxy.pathsuffix == "/oauth/accesstoken"</Condition>
<Request>
<Step><Name>GenerateAccessToken</Name></Step>
</Request>
</Flow>
</Flows>
ポリシーでフローを構成する
各エンドポイントにはポリシーが関連付けられています。ポリシーの例を見てみましょう。OAuthV2 ポリシーをプロキシ エンドポイントに追加するために必要な手順の概要については、OAuth エンドポイントとポリシーの構成もご覧ください。
ログイン リダイレクト
これは /oauth/authorize
パスです。接続されたポリシーによって、ユーザーはログインアプリにリダイレクトされます。ここで、エンドユーザーはクライアント アプリを安全に認証して、保護されたリソースへのアクセスを許可できます。クライアント アプリにユーザー名とパスワードを提供する必要はありません。この方法は、サービス コールアウト ポリシー、JavaScript、その他の手段で実現できます。
リクエストを行うための API 呼び出しは GET であり、クエリ パラメータの client_id、response_type、redirect_uri、scope、state が必要です。
$ curl http://myorg-test.apigee.net/oauth/authorize?client_id={consumer_key}&response_type=code&redirect_uri={redirect_uri}&scope=scope1%20scope2&state={some_string}
認証コードを取得する
これは /oauth/authorizationcode
パスです。GenerateAuthorizationCode オペレーションが指定された OAuthV2 ポリシーが使用されています。
<OAuthV2 async="false" continueOnError="false" enabled="true" name="GetAuthCode"> <DisplayName>GetAuthCode</DisplayName> <Operation>GenerateAuthorizationCode</Operation> <ExpiresIn>600000</ExpiresIn> <GenerateResponse/> </OAuthV2>
認証コードを取得するための API 呼び出しは GET であり、次の例に示すようにクエリ パラメータの client_id、response_type、必要に応じて scope、state が必要です。
$curl http://myorg-test.apigee.net/oauth/authorizationcode?client_id={consumer_key}&response_type=code&scope=scope1%20scope2&state={some_string}
アクセス トークンを取得する
このポリシーは、/oauth/accesstoken
パスに接続されています。GenerateAccessCode オペレーションが指定された OAuthV2 ポリシーが使用されています。この場合、grant_type パラメータはクエリ パラメータとして想定されています。
<OAuthV2 name="GetAccessToken"> <Operation>GenerateAccessToken</Operation> <ExpiresIn>360000000</ExpiresIn> <SupportedGrantTypes> <GrantType>authorization_code</GrantType> </SupportedGrantTypes> <GrantType>request.queryparam.grant_type</GrantType> <GenerateResponse/> </OAuthV2>
アクセスコードを取得するための API 呼び出しは POST であり、client_id、client_secret、grant_type=authorization_code、必要に応じて scope が含まれている必要があります。次に例を示します。
$ curl https://{org_name}-test.apigee.net/oauth/accesstoken?grant_type=authorization_code -X POST -d 'client_id=bBGAQrXgivA9lKu7NMPyoYpVKNhGar6K&client_secret=hAr4Gn0gA9vAyvI4'
これは基本的な概要にすぎません。本番環境の例には、URL の構築、変換の実施、その他のタスクの実行に使用するポリシーが他にも多数含まれています。完全かつ実用的なプロジェクトについては、GitHub のサンプルをご覧ください。
アクセス トークン検証ポリシーの接続
保護された API にアクセスするすべてのフローの先頭に VerifyAccessToken ポリシー(VerifyAccessToken オペレーションが指定されている OAuthV2 ポリシー)を接続し、保護されたリソースに対するリクエストが発生するたびに実行されるようにします。Apigee は、各リクエストに有効なアクセス トークンがあることを確認します。ない場合は、エラーが返されます。基本的な手順については、アクセス トークンの検証をご覧ください。
<OAuthV2 async="false" continueOnError="false" enabled="true" name="VerifyAccessToken"> <DisplayName>VerifyAccessToken</DisplayName> <ExternalAuthorization>false</ExternalAuthorization> <Operation>VerifyAccessToken</Operation> <SupportedGrantTypes/> <GenerateResponse enabled="true"/> <Tokens/> </OAuthV2>
保護された API の呼び出し
OAuth 2.0 セキュリティで保護された API を呼び出すには、有効なアクセス トークンを提示する必要があります。正しいパターンでは、次のように認証ヘッダーにトークンを含めます。アクセス トークンは署名なしトークンとも呼ばれます。
$ curl -H "Authorization: Bearer UAj2yiGAcMZGxfN2DhcUbl9v8WsR" \ http://myorg-test.apigee.net/v0/weather/forecastrss?w=12797282
アクセス トークンの送信もご覧ください。