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

Edge for Private Cloud v. 4.17.01

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

OAuth アクセス トークンには、アプリ ID が自動的に追加されます。したがって、以下の手順を使用して組織のトークン アクセスを有効にした後は、アプリ 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

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

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

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

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

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

次の呼び出しを行うユーザーには、対象の組織に対するロール orgadmin または opsadmin が必要です。{中かっこ} の値を組織固有の値に置き換えます。

> curl -H "Content-type:text/xml" -X POST \
  https://<ms-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 {userEmail}:{mypassword}

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

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

https://<ms-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 コマンドを使用して、/oauth2 リソースに対する get 権限と put 権限を opsadmin ロールに付与します。{curly braces} の値を組織固有の値に置き換えます。

> curl -X POST -H 'Content-type:application/xml' \
  http://<ms-ip>:8080/v1/organizations/{org}/userroles/opsadmin/permissions \
  -d '<ResourcePermission path="/oauth2">
      <Permissions>
        <Permission>get</Permission>
        <Permission>put</Permission>
      </Permissions>
    </ResourcePermission>' \
  -u {USEREMAIL}:{PWD} 

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

> curl -X DELETE -H 'Content-type:application/xml' \
  http://<msip>:8080/v1/organizations/{org-name}/userroles/{roles}/permissions \
  -d '<ResourcePermission path="/oauth2">
      <Permissions></Permissions>
    </ResourcePermission>' \
   -u {USEREMAIL}:{PWD} 

ステップ 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 を提供するフロー変数を使用する