パスワードの権限付与タイプの実装

このページは ApigeeApigee ハイブリッドに適用されます。

Apigee Edge ドキュメントを表示する

リソース オーナー パスワード(または「パスワード」)の権限付与タイプは、主にアプリの信頼性が高い場合に使用されます。この構成では、ユーザーがリソース サーバーの認証情報(ユーザー名 / パスワード)をクライアント アプリに提供すると、クライアント アプリからアクセス トークン リクエストでそれらの認証情報が Apigee に送信されます。送信された認証情報は ID サーバーによって検証され、情報が有効であれば Apigee がアクセス トークンを作成してアプリに返します。

このトピックについて

このトピックでは、OAuth 2.0 リソース オーナー パスワード権限付与タイプフローの概要を示し、このフローを Apigee に実装する方法について説明します。

参考例

  • パスワード権限付与タイプの使用: トークン リクエストを作成する方法、パスワード権限付与タイプ用の OAuthV2 ポリシーを構成する方法、Apigee でポリシーのエンドポイントを構成する方法を示します。
  • oauth-validate-key-secret: GitHub 内のサンプル プロキシ。Apigee にデプロイして試すことができます。パスワードの権限付与タイプを使用するエンドツーエンドのサンプルです。クライアント アプリの認証情報(キー / シークレット)を認証した後にユーザーの認証情報を ID プロバイダに送信する、というベスト プラクティスの実例が示されています。

動画

動画: パスワード付与タイプ実装時にこの動画をご覧ください。

ユースケース

この権限付与タイプは、ユーザーが自分のリソース サーバーの認証情報をアプリに提供する必要があるため、信頼性や権限が高いアプリで使用します。通常、そのようなアプリには、ユーザーが自分の認証情報を入力するログイン画面があります。

フロー図

次のフロー図は、Apigee が認可サーバーとして機能するリソース オーナー パスワード権限付与タイプのフローを示したものです。

ヒント: この図の拡大版を表示するには、右クリックして新しいタブで開くか、保存して画像ビューアで開きます。

リソース オーナー パスワード権限付与タイプのフロー。

パスワード権限付与タイプのフローのステップ

Apigee が認可サーバーとして機能するパスワード権限付与タイプを実装するために必要な手順の概要を以下に示します。

前提条件: クライアント アプリを Apigee に登録して、クライアント ID とクライアント シークレット キーを取得する必要があります。詳細については、クライアント アプリの登録をご覧ください。

1. ユーザーがフローを開始して認証情報を入力する

アプリがユーザーの保護されたリソースにアクセスする必要がある場合(たとえば、ユーザーがアプリ内のボタンをクリックした場合)、ユーザーはログイン フォームにリダイレクトされます。

2. アプリが Apigee からアクセス トークンをリクエストする

アプリは、ユーザーの認証情報を含むアクセス トークン リクエストを、Apigee の GenerateAccessToken エンドポイントに送信します。

サンプル POST リクエストを次に示します。この例には、この権限付与タイプの必須パラメータが含まれています。

$ curl -i \
  -X POST \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'Authorization: Basic c3FIOG9vSGV4VHo4QzAySVg5T1JvNnJoZ3ExaVNyQWw6WjRsanRKZG5lQk9qUE1BVQ' \
  -d 'grant_type=password&username=the-user-name&password=the-users-password' \
  https://docs-test.apigee.net/oauth/token

上記のコマンドの代わりに、次のように curl の -u オプションを使用して、Base64 エンコードの Basic 認証ヘッダーを作成することもできます。

$ curl -i \
  -X POST \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -u sqH8ooHexTz8C02IX9ORo6rhgq1iSrAl:Z4ljtJdneBOjPMAU \
  -d 'grant_type=password&username=the-user-name&password=the-users-password' \
  https://docs-test.apigee.net/oauth/token

(これらのコマンドはそれぞれ 1 行にすべて入力してください。)

ユーザー認証情報はフォーム パラメータに含まれる一方、クライアント認証情報は HTTP 基本認証ヘッダー内でエンコードされます。必要な Basic 認証ヘッダーの詳細など、この API 呼び出しの詳細については、OAuth 2.0 トークンを取得するのパスワード付与のセクションをご覧ください。

3. Apigee でクライアント アプリを検証する

ユーザー名とパスワードを ID プロバイダに送信する前に、Edge は、リクエストを行っているクライアント アプリが有効で信頼できるアプリであることを確認する必要があります。これを行う方法の一つは、API 呼び出しで API キー認証を使用することです。場合によっては、クライアント キーとシークレットの両方を検証することもできます。GitHub の api-platform-samples リポジトリにこのもう一つの手法を表すサンプル プロキシが掲載されています。

4. Apigee がログイン認証情報を処理する

クライアント アプリの検証が完了したら、ユーザーの認証情報を送信することで、Service Callout または JavaScript ポリシーを使用して ID サービスを呼び出すことができます。たとえば、LDAP サービスや、認証情報の検証に使用する任意のサービスを使用できます。これらのポリシーの詳細については、Extract Variables ポリシーJavaScript ポリシーをご覧ください。

ID サービスが認証情報を検証して 200 レスポンスを返した場合、Apigee はリクエストの処理を続行します。それ以外の場合、Apigee は処理を停止して、クライアント アプリにエラーを返します。

5. OAuthV2 ポリシーが実行される

認証情報が有効な場合、次の処理ステップとして、パスワード権限付与タイプに対して構成された OAuthV2 ポリシーが実行されます。たとえば、<UserName> と <PassWord> 要素は必須で、これらは ExtractVariables ポリシーにより保存されたフロー変数から取得できます。このポリシーの詳細な参考情報については、OAuthV2 ポリシーをご覧ください。

<OAuthV2 name="GetAccessToken">
  <Operation>GenerateAccessToken</Operation>
  <ExpiresIn>360000000</ExpiresIn>
  <SupportedGrantTypes>
     <GrantType>password</GrantType>
  </SupportedGrantTypes>
  <GrantType>request.queryparam.grant_type</GrantType>
  <UserName>login</UserName>
  <PassWord>password</PassWord>
  <GenerateResponse/>
</OAuthV2>

このポリシーが成功すると、アクセス トークンが含まれたレスポンスが生成され、クライアントに返されます。レスポンスは JSON 形式です。次に例を示します。access_token は複数ある要素の中の一つです。

{
    "issued_at": "1420258685042",
    "scope": "READ",
    "application_name": "ce1e94a2-9c3e-42fa-a2c6-1ee01815476b",
    "refresh_token_issued_at": "1420258685042",
    "status": "approved",
    "refresh_token_status": "approved",
    "api_product_list": "[PremiumWeatherAPI]",
    "expires_in": "1799",
    "developer.email": "tesla@weathersample.com",
    "organization_id": "0",
    "token_type": "BearerToken",
    "refresh_token": "IFl7jlijYuexu6XVSSjLMJq8SVXGOAAq",
    "client_id": "5jUAdGv9pBouF0wOH5keAVI35GBtx3dT",
    "access_token": "I6daIgMSiUgYX1K2qgQWPi37ztS6",
    "organization_name": "docs",
    "refresh_token_expires_in": "0",
    "refresh_count": "0"
}

6. 保護された API をクライアントが呼び出す

ここで、有効なアクセスコードを使って、クライアントは保護された API を呼び出すことができます。このシナリオでは、Apigee(プロキシ)にリクエストが行われ、Apigee はターゲット リソース サーバーに API 呼び出しを渡す前にアクセス トークンを検証します。アクセス トークンは認証ヘッダーで渡されます。次に例を示します。

$ curl -H "Authorization: Bearer I6daIgMSiUgYX1K2qgQWPi37ztS6
" http://{org_name}-test.apigee.net/weather/forecastrss?w=12797282