OAuth2 を使用して Management API にアクセスする

Apigee Edge では、OAuth2 トークンで認証された Management API 呼び出しを行うことができます。OAuth2 のサポートは、Cloud アカウントについては Edge 上でデフォルトで有効になっています。Apigee Edge for Public Cloud を使用している場合、最初に SAML を設定しなければ、OAuth2 を使用できません。

OAuth2 の仕組み(Apigee Management API を使用)

Apigee の Management API を呼び出す場合、ユーザーが本人であることを確認するための認証が必要です。ユーザーを認証するには、API にアクセスするリクエストと一緒に OAuth2 アクセス トークンを送信する必要があります。

たとえば、Edge 上の組織に関する詳細情報を取得する場合は、次のような URL にリクエストを送信します。

https://api.enterprise.apigee.com/v1/organizations/ahamilton-eval

しかし、ユーザーが誰であるかを伝えずに、リクエストを送信することはできません。そうでなければ、組織の詳細情報を誰でも表示できることになります。

ここで OAuth2 が必要となります。ユーザーを認証するために、ユーザーにこのリクエストでアクセス トークンも送信してもらう必要があります。アクセス トークンによってユーザーが識別されるため、組織の詳細情報を表示することが許可されたユーザーであることを確認できます。

幸いなことに、Edge OAuth2 サービスに認証情報を送信することによってトークンを取得できます。このサービスはアクセス トークンとリフレッシュ トークンで応答します。

OAuth2 のフロー: 最初のリクエスト

次の図は、Management API に初めてアクセスしたときの OAuth2 のフローを示しています。

OAuth のフロー: 最初のリクエスト
図 1: OAuth のフロー: 最初のリクエスト

図 1 に示すように、Management API への最初のリクエストを行うと、次のようになります。

  1. アクセス トークンをリクエストします。この操作は、Management APIacurl、または get_token で行うことができます。次に例を示します。
    get_token
        Enter username:
        ahamilton@apigee.com
        Enter the password for user 'ahamilton@apigee.com'
        mypassw0rd
        Enter the six-digit code if 'ahamilton@apigee.com' is MFA enabled or press ENTER:
        123456
  2. Edge OAuth2 サービスはアクセス トークンで応答し、stdout に出力します。次に例を示します。
        Dy42bGciOiJSUzI1NiJ9.eyJqdGkiOiJhM2YwNjA5ZC1lZTIxLTQ1YjAtOGQyMi04MTQ0MTYxNjNhNTMiLCJz
        AJpdGUiLCJhcHByb3ZhbHMubWUiLCJvYXV0aC5hcHByb3ZhbHMiXSwiY2xpZW50X2lkIjoiZWRnZWNsaSIsIm
        NjbGkiLCJhenAiOiJlZGdlY2xpIiwiZ3JhbnRfdHlwZSI6InBhc3N3b3JkIiwidXNlcl9pZCI6IjJkMWU3NDI
        GzQyMC1kYzgxLTQzMDQtOTM4ZS1hOGNmNmVlODZhNzkiLCJzY29wZSI6WyJzY2ltLm1lIiwib3BlbmlkIiwic
        ENC05MzhlLWE4Y2Y2ZWU4NmE3OSIsIm9yaWdpbiI6InVzZXJncmlkIiwidXNlcl9uYW1lIjoiZGFuZ2VyNDI0
        RI6ImUyNTM2NWQyIiwiaWF0IjoxNTI4OTE2NDA5LCJleHAiOjE1Mjg5MTgyMDksImlzcyI6Imh0dHBzOi8vbG
        420iLCJlbWFpbCI6ImRhbmdlcjQyNDJAeWFob28uY29tIiwiYXV0aF90aW1lIjoxNTI4OTE2NDA5LCJhbCI6M
        2lLmNvbSIsInppZCI6InVhYSIsImF1ZCI6WyJlZGdlY2xpIiwic2NpbSIsIm9wZW5pZCIsInBhc3N3b3JkIiw

    acurl および get_token ユーティリティは、アクセス トークンとリフレッシュ トークンを ~/.sso-cli にサイレントに保存します(リフレッシュ トークンは stdout に書き込まれません)。トークンを取得するために Management API を使用する場合は、後で使用するためにトークンを保存する必要があります。

  3. アクセス トークンと一緒にリクエストを Management API に送信します。acurl はトークンを自動的に付加します。次に例を示します。
    acurl https://api.enterprise.apigee.com/v1/organizations/ahamilton-eval

    別の HTTP クライアントを使用する場合は、必ずアクセス トークンを追加してください。次に例を示します。

    curl -v https://api.enterprise.apigee.com/v1/organizations/ahamilton-eval \
          -H "Authorization: Bearer ACCESS_TOKEN"
  4. Management API はリクエストを実行し、通常はデータを含むレスポンスを返します。

OAuth2 のフロー: 後続のリクエスト

その後のリクエストでは、トークン用の認証情報を交換する必要はありません。ユーザーがすでに持っているアクセス トークンが期限切れになっていなければ、認証情報を交換する代わりにアクセス トークンを含めるだけでかまいません。

OAuth のフロー: 後続のリクエスト
図 2: OAuth のフロー: 後続のリクエスト

図 2 に示すように、すでにアクセス トークンを持っている場合は次のようになります。

  1. アクセス トークンと一緒にリクエストを Management API に送信します。acurl はトークンを自動的に付加します。他のツールを使用する場合は、トークンを手動で追加する必要があります。
  2. Management API はリクエストを実行し、通常はデータを含むレスポンスを返します。

OAuth2 のフロー: アクセス トークンが期限切れになったとき

アクセス トークンが期限切れになると(30 分後)、リフレッシュ トークンを使用して新しいアクセス トークンを取得できます。

OAuth のフロー: 新しいアクセス トークンの取得
図 3: OAuth のフロー: 新しいアクセス トークンの取得

図 3 に示すように、アクセス トークンが期限切れになった場合は次のようになります。

  1. Management API にリクエストを送信しますが、アクセス トークンは期限切れになっています。
  2. Management API は、リクエストを認可されていないものとして拒否します。
  3. Edge OAuth2 サービスにリフレッシュ トークンを送信します。acurl を使用している場合、この操作は自動的に行われます。
  4. Edge OAuth2 サービスは新しいアクセス トークンで応答します。
  5. 新しいアクセス トークンと一緒にリクエストを Management API に送信します。
  6. Management API はリクエストを実行し、通常はデータを含むレスポンスを返します。

トークンを取得する

Management API に送信できるアクセス トークンを取得するには、curl などのユーティリティに加えて次の Apigee ユーティリティを使用できます。

  • get_token ユーティリティ: Apigee 認証情報をアクセス トークンおよびリフレッシュ トークンと交換します。
  • acurl ユーティリティ: Apigee 認証情報をトークンと交換し、リクエストにアクセス トークンを渡し、アクセス トークンが期限切れになったときにアクセス トークンを自動的に更新する curl ラッパー。
  • Management API のトークン エンドポイント: Management API への呼び出しを介して、Apigee 認証情報をアクセス トークンおよびリフレッシュ トークンと交換します。

これらのユーティリティはすべて、Apigee アカウントの認証情報(メールアドレスとパスワード)をアクセス トークンと交換します。これらのトークンは 30 分間有効です。

また、これらのユーティリティは、リフレッシュ トークンを送信します。リフレッシュ トークンは、アクセス トークンが期限切れになったときに新しいアクセス トークンと交換するために使用できます。リフレッシュ トークンは 24 時間有効です。したがって、24.5 時間後は新しいトークンための認証情報を再度送信する必要があります。

OAuth2 を使用して Management API にアクセスする

Management API にアクセスするには、API エンドポイントにリクエストを送信し、アクセス トークンを含めます。この操作は、curl などのコマンドライン ユーティリティ、Postman などのブラウザベースの UI、acurl のような Apigee ユーティリティなどの任意の HTTP クライアントで行うことができます。

acurl および curl をそれぞれ使用した Management API へのアクセスについては、以降のセクションで説明します。

acurl の使用

acurl を使用して Management API にアクセスするには、最初のリクエストにユーザーの認証情報を含める必要があります。Edge OAuth2 サービスは、アクセス トークンとリフレッシュ トークンで応答します。acurl はトークンをローカルに保存します。

その後のリクエストでは、acurl~/.sso-cli に保存されたトークンを使用するため、トークンが期限切れになるまで認証情報を再度含める必要はありません。

次の例は、「ahamilton-eval」という組織の詳細情報を取得する最初の acurl リクエストを示しています。

acurl https://api.enterprise.apigee.com/v1/organizations/ahamilton-eval \
      -u ahamilton@apigee.com
    Enter the password for user 'ahamilton@apigee.com'
    mypassw0rd
    {
      "createdAt" : 1491854501264,
      "createdBy" : "noreply_iops@apigee.com",
      "displayName" : "ahamilton",
      "environments" : [ "prod", "test" ],
      "lastModifiedAt" : 1491854501264,
      "lastModifiedBy" : "noreply_iops@apigee.com",
      "name" : "ahamilton",
      "properties" : {
        "property" : [ {
          "name" : "features.isSmbOrganization",
          "value" : "false"
        }, {
          "name" : "features.isCpsEnabled",
          "value" : "true"
        } ]
      },
      "type" : "trial"
    }

    acurl https://api.enterprise.apigee.com/v1/o/ahamilton-eval/apis/helloworld/revisions/1/policies

    [ "SOAP-Message-Validation-1", "Spike-Arrest-1", "XML-to-JSON-1" ]

この例では、組織の詳細情報を取得するだけでなく、「helloworld」という API プロキシ内のポリシーのリストを取得する 2 番目のリクエストも示しています。2 番目のリクエストでは、「組織(organization)」の短縮を表す「o」を URL に使用しています。

acurl は 2 番目のリクエストではアクセス トークンを自動的に渡します(acurl が OAuth2 トークンを一度格納したら、ユーザー認証情報を渡す必要はありません)。トークンは ~/.sso-cli から取得されます。

詳細については、acurl を使用して Management API にアクセスするをご覧ください。

curl の使用

curl を使用して Management API にアクセスできます。これを行うには、まずアクセス トークンとリフレッシュ トークンを取得する必要があります。これらのトークンは、get_tokenManagement API などのユーティリティを使用して取得できます。

アクセス トークンを正常に保存したら、次の例に示すように、Management API への呼び出しの Authorization ヘッダー内でそのトークンを渡します。

curl -v https://api.enterprise.apigee.com/v1/organizations/ahamilton-eval \
      -H "Authorization: Bearer ACCESS_TOKEN"

トークンの有効期限

トークンの有効期間は次のとおりです。

  • アクセス トークンの有効期間は 1,799 秒(約 30 分)
  • リフレッシュ トークンの有効期間は 84,600 秒(約 24 時間)

アクセス トークンが期限切れになったら、認証情報を再度送信しなくても、リフレッシュ トークンを使用して新しいアクセス トークンを取得できます。

アクセス トークンを更新する方法は、使用しているツールによって異なります。

  • acurl: 何もする必要ありません。期限切れのアクセス トークンが含まれているリクエストが送信されると、acurl はアクセス トークンを自動的に更新します。
  • get_token: アクセス トークンを更新するために get_token を呼び出します。
  • Management API: 以下を含むリクエストを送信します。
    • リフレッシュ トークン
    • "refresh_token" に設定された grant_type フォーム パラメータ