ユーザー ID とアプリ ID による OAuth 2.0 トークンへのアクセスを有効にする

このドキュメントでは、エンドユーザー ID、アプリ ID、またはその両方による OAuth 2.0 アクセス トークンの取得と取り消しを有効にする方法について説明します。

アプリ ID は OAuth アクセス トークンに自動的に追加されます。したがって、次の手順に沿って組織のトークン アクセスを有効にすると、アプリ ID でトークンにアクセスできるようになります。

エンドユーザー ID で OAuth 2.0 アクセス トークンを取得して取り消すには、アクセス トークンにエンドユーザー ID が含まれている必要があります。次の手順では、エンドユーザー ID を既存のトークンまたは新しいトークンに追加する方法について説明します。

デフォルトでは、Edge が OAuth 2.0 アクセス トークンを生成する際のトークンの形式は次のとおりです。

{
  "issued_at" : "1421847736581",
  "application_name" : "a68d01f8-b15c-4be3-b800-ceae8c456f5a",
  "scope" : "READ",
  "status" : "approved",
  "api_product_list" : "[PremiumWeatherAPI]",
  "expires_in" : "3599",
  "developer.email" : "tesla@weathersample.com",
  "organization_id" : "0",
  "token_type" : "BearerToken",
  "client_id" : "k3nJyFJIA3p62DWOkLO6OJNi87GYXFmP",
  "access_token" : "7S22UqXGJDTuUADGzJzjXzXSaGJL",
  "organization_name" : "myorg",
  "refresh_token_expires_in" : "0",
  "refresh_count" : "0"
}

次の点に注意してください。

  • application_name フィールドには、トークンに関連付けられているアプリの UUID が含まれます。アプリ ID による OAuth 2.0 アクセス トークンの取得と取り消しを有効にする場合は、アプリ ID を使用します。
  • access_token フィールドには OAuth 2.0 アクセス トークンの値が含まれます。

エンドユーザー ID による OAuth 2.0 アクセス トークンの取得と取り消しを有効にするには、以下の手順で説明するように、トークンにユーザー ID が含まれるように OAuth 2.0 ポリシーを構成します。

エンドユーザー ID は、デベロッパーのメールアドレスではなく、Edge がデベロッパー ID として使用する文字列です。Get Developer API 呼び出しを使用して、デベロッパーのメールアドレスからデベロッパー ID を確認できます。

トークンにエンドユーザー ID が含まれるように Edge を構成すると、以下に示すように、ID が app_enduser フィールドに追加されます。

{
  "issued_at" : "1421847736581",
  "application_name" : "a68d01f8-b15c-4be3-b800-ceae8c456f5a",
  "scope" : "READ",
  "app_enduser" : "6ZG094fgnjNf02EK",
  "status" : "approved",
  "api_product_list" : "[PremiumWeatherAPI]",
  "expires_in" : "3599",
  "developer.email" : "tesla@weathersample.com",
  "organization_id" : "0",
  "token_type" : "BearerToken",
  "client_id" : "k3nJyFJIA3p62DWOkLO6OJNi87GYXFmP",
  "access_token" : "7S22UqXGJDTuUADGzJzjXzXSaGJL",
  "organization_name" : "myorg",
  "refresh_token_expires_in" : "0",
  "refresh_count" : "0"
}

ユーザー ID とアプリ ID で OAuth 2.0 アクセス トークンの取得と取り消しを行う API

ユーザー ID、アプリ ID、またはその両方で OAuth トークンにアクセスするには、次の API を使用します。

トークン アクセスを有効にする手順

エンドユーザー ID とアプリ ID による OAuth 2.0 アクセス トークンの取得と取り消しを有効にするには、次の手順を行います。

ステップ 1: 組織でトークン アクセスのサポートを有効にする

トークン アクセスは、組織ごとに個別に有効にする必要があります。エンドユーザー ID またはアプリ ID による OAuth 2.0 アクセス トークンの取得と取り消しを有効にする組織ごとに、以下の PUT API を呼び出します。

次の呼び出しを行うユーザーには、組織の orgadmin または opsadmin のロールが付与されている必要があります。values は組織固有の値に置き換えます。

curl -H "Content-type:text/xml" -X POST \
  https://management_server_IP;:8080/v1/organizations/org_name \
  -d '<Organization name="org_name">
      <Properties>
        <Property name="features.isOAuthRevokeEnabled">true</Property>
        <Property name="features.isOAuth2TokenSearchEnabled">true</Property>
      </Properties>
    </Organization>' \
  -u USER_EMAIL:PASSWORD

ステップ 2: 組織の opsadmin ロールの権限を設定する

ユーザー ID またはアプリ ID に基づいて OAuth 2.0 トークンの取得(HTTP GET)と取り消し(HTTP PUT)を行う権限は、組織内の orgadmin ロールと opsadmin ロールにのみ付与してください。アクセスを制御するには、組織の /oauth2 リソースに get 権限と put 権限を設定します。このリソースの URL の形式は次のとおりです。

https://management_server_IP:8080/v1/organizations/org_name/oauth2

orgadmin ロールには、必要な権限がすでに付与されているはずです。/oauth2 リソースの opsadmin ロールの場合、権限は次のようになります。

<ResourcePermission path="/oauth2">
  <Permissions>
    <Permission>get</Permission>
    <Permission>put</Permission>
  </Permissions>
</ResourcePermission>

単一リソース API の権限を取得する呼び出しを使用すると、/oauth2 リソースに対する権限を持つロールを確認できます。

レスポンスに応じて、リソースに対する権限をロールに追加する API 呼び出しと リソースの権限を削除する API 呼び出しを使用し、/oauth2 リソースの権限に必要な調整を行うことができます。

次の curl コマンドを使用して、opsadmin ロールに /oauth2 リソースに対する get 権限と put 権限を付与します。values は組織固有の値に置き換えます。

curl -X POST -H 'Content-type:application/xml' \
  http://management_server_IP:8080/v1/organizations/org_name/userroles/opsadmin/permissions \
  -d '<ResourcePermission path="/oauth2">
      <Permissions>
        <Permission>get</Permission>
        <Permission>put</Permission>
      </Permissions>
    </ResourcePermission>' \
  -u USEREMAIL:PASSWORD

次の curl コマンドを使用して、/oauth2 リソースの get 権限と put 権限を orgadminopsadmin 以外のロールから取り消します。values は組織固有の値に置き換えます。

curl -X DELETE -H 'Content-type:application/xml' \
  http://management_server_IP:8080/v1/organizations/org_name/userroles/roles/permissions \
  -d '<ResourcePermission path="/oauth2">
      <Permissions></Permissions>
    </ResourcePermission>' \
   -u USEREMAIL:PASSWORD

ステップ 3: oauth_max_search_limit プロパティを設定する

/opt/apigee/customer/application/management-server.properties ファイルの conf_keymanagement_oauth_max_search_limit プロパティが 100 に設定されていることを確認します。

conf_keymanagement_oauth_max_search_limit = 100

このファイルが存在しない場合は作成します。

このプロパティでは、トークンの取得時に使用するページサイズを設定します。Apigee では 100 の値を推奨していますが、必要に応じて設定できます。

新規インストールでは、このプロパティはすでに 100 に設定されているはずです。このプロパティの値を変更する必要がある場合は、次のコマンドを使用して Management Server と Message Processor を再起動します。

/opt/apigee/apigee-service/bin/apigee-service edge-management-server restart
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart

ステップ 4: エンドユーザー ID を含むトークンを生成する OAuth 2.0 ポリシーを構成する

エンドユーザー ID をトークンに含めるように、アクセス トークンの生成に使用する OAuth 2.0 ポリシーを構成します。エンドユーザー ID をアクセス トークンに含めると、ID でトークンの取得と取り消しができます。

アクセス トークンにエンドユーザー ID を含めるようにポリシーを構成するには、アクセス トークンを作成するリクエストにエンドユーザー ID を含める必要があります。また、エンドユーザー ID を含む入力変数を指定する必要があります。

以下の GenerateAccessTokenClient という OAuth 2.0 ポリシーは、OAuth 2.0 アクセス トークンを生成します。エンドユーザー ID を含む変数を指定する <AppEndUser> タグが太字で追加されています。

<OAuthV2 async="false" continueOnError="false" enabled="true" name="GenerateAccessTokenClient">
    <DisplayName>OAuth 2.0.0 1</DisplayName>
    <ExternalAuthorization>false</ExternalAuthorization>
    <Operation>GenerateAccessToken</Operation>
    <SupportedGrantTypes>
         <GrantType>client_credentials</GrantType>
    </SupportedGrantTypes>
    <GenerateResponse enabled="true"/>
    <GrantType>request.queryparam.grant_type</GrantType> 
    <AppEndUser>request.header.appuserID</AppEndUser> 
    <ExpiresIn>960000</ExpiresIn>
</OAuthV2>

次に、次の curl コマンドを使用して OAuth 2.0 アクセス トークンを生成し、ユーザー ID を appuserID ヘッダーとして渡します。

curl -H "appuserID:6ZG094fgnjNf02EK" \
  https://myorg-test.apigee.net/oauth/client_credential/accesstoken?grant_type=client_credentials \
  -X POST -d 'client_id=k3nJyFJIA3p62TKIkLO6OJNXFmP&client_secret=gk5K5lIp943AY4'

この例では、appuserID がリクエスト ヘッダーとして渡されます。情報は、さまざまな方法でリクエストの一部として渡すことができます。たとえば、以下を使用します。

  • フォーム パラメータ変数 request.formparam.appuserID を使用する
  • エンドユーザー ID を提供するフロー変数を使用する