Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントに移動します。 情報
バージョン: 1.3.2
指定した Google API へのアクセスを Google を使用して認証します。
この拡張機能を使用して Google Cloud サービスのトークン(OAuth または JWT)を取得し、ServiceCallout ポリシーなどを使用して、後続の Google API 呼び出しでトークンを使用します。
たとえば、API プロキシでこの拡張機能を使用してトークンを取得し、PopulateCache ポリシーを使用してトークンをキャッシュに保存してから、ServiceCallout ポリシーを介してトークンを渡し、API プロキシフロー内から Google Cloud サービスにアクセスできます。
前提条件
ここでは、この拡張機能の構成と使用に関するリファレンスを提供します。ExtensionCallout ポリシーで API プロキシ経由で拡張機能を使用する前に、次のことを行う必要があります。
拡張機能が使用するアカウント(認証情報に使用するサービス アカウントで表されるアカウント)が、拡張機能が認証を行う Google Cloud サービスにアクセスできることを確認します。
構成リファレンスを使用して拡張機能の追加と構成を行うときに、生成されたサービス アカウント キーの JSON ファイルのコンテンツを使用します。
Google Cloud での認証について
この拡張機能は、Google Cloud プロジェクトで定義された特定のメンバーを表すことで、Google Cloud から認証をリクエストします。この拡張機能を構成するときに、そのプロジェクト メンバーのサービス アカウント JSON ファイルを使用します。
この拡張機能からアクセスできるのは、メンバーがアクセスできるリソースに限定されます。つまり、この拡張機能による認証が成功するかどうかは、Google Cloud コンソールで付与された権限と、実行時に拡張機能によってリクエストされたアクセス(スコープまたはオーディエンス経由)が一致するかどうかによって決まります。
一般的に、この拡張機能から API へのアクセスを認証する手順は次のようになります。
この拡張機能が表すメンバーのサービス アカウントに、アクセスを希望する Google リソースへのアクセス権があることを確認します。Google Cloud コンソールの Cloud Identity and Access Management(Cloud IAM)ページから、この拡張機能が表すプロジェクト メンバーにロールを付与できます。
この拡張機能を構成するときに、そのメンバーのサービス アカウント キーの JSON を使用します。
この拡張機能を使用するように ExtensionCallout ポリシーを構成する場合は、プロジェクト メンバーがアクセスできるリソースに対してのみ認証をリクエストします。
サンプル
次の例は、ExtensionCallout ポリシーを使用して Google Cloud で認証を行う方法を示しています。
アクセス トークンを取得する
次の例では、拡張機能の getOauth2AccessToken アクションで Cloud Translation API へのリクエストに使用するトークンを取得します。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ConnectorCallout async="false" continueOnError="true" enabled="true" name="Get-Access-Token">
<DisplayName>Get Access Token</DisplayName>
<Connector>google-auth</Connector>
<Action>getOauth2AccessToken</Action>
<Input><![CDATA[{
"scope" : [
"https://www.googleapis.com/auth/cloud-translation"
]
}]]></Input>
<Output>google.credentials</Output>
</ConnectorCallout>
レスポンス値は次のようになります。
{
"access_token":"ya29.c.ElpSB...BMgkALBJ0kou-8",
"token_type":"Bearer",
"expiresInSec": 3600
}
次の AssignMessage ポリシーは、上記の ExtensionCallout ポリシーからレスポンス値を取得してレスポンス ペイロードにコピーします。これはデバッグに役立ちます。実際には、トークンをクライアントに返さない方がよい場合があります。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="false" enabled="true" name="Retrieve-Auth-Token">
<DisplayName>Retrieve Auth Token</DisplayName>
<AssignTo type="response" createNew="false"/>
<Set>
<Payload contentType="application/json">{google.credentials.access_token}</Payload>
</Set>
</AssignMessage>
アクセス トークンをキャッシュに保存する
トークンを取得するための不要な呼び出しを回避するには、受け取ったトークンをキャッシュに保存することを検討してください。トークンを必要とする後続の呼び出しでは、Apigee Edge キャッシュからトークンを取得する方が、新しいトークンを取得するよりも高速になります。キャッシュに保存されたトークンの有効期限が切れたら、新しいトークンを取得してキャッシュを更新します。
次のコードはサンプル API プロキシからのもので、ServiceCallout ポリシーで Google Translation API を呼び出すため、キャッシュに保存されているトークンを設定して使用する方法について説明しています。ここに示す各コード例は、フロー内の異なるポリシーに対応しています。
次のポリシーは、次のフロー XML で記述された順序で実行されます。
<Request>
<!-- Attempt to get a token from the cache. -->
<Step>
<Name>Get-Cached-Auth-Token</Name>
</Step>
<!-- Only execute the following ExtensionCallout policy if the call to the
cache couldn't retrieve a cached token. -->
<Step>
<Name>Google-Auth-Callout</Name>
<Condition>lookupcache.Get-Cached-Auth-Token.cachehit is false</Condition>
</Step>
<!-- Only execute the following PopulateCache policy if the call to the
cache couldn't retrieve a cached token. -->
<Step>
<Name>Cache-Auth-Token</Name>
<Condition>lookupcache.Get-Cached-Auth-Token.cachehit is false</Condition>
</Step>
<!-- Use the ServiceCallout policy to call the translate API. -->
<Step>
<Name>Translate-Text</Name>
</Step>
</Request>
次の LookupCache ポリシーは、キャッシュからのトークンの取得を試みます。トークンがすでに取得されてキャッシュに保存されている場合、このポリシーは API プロキシで使用するためにトークンを取得します。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <LookupCache async="false" continueOnError="false" enabled="true" name="Get-Cached-Auth-Token"> <DisplayName>Get Cached Auth Token</DisplayName> <!-- Give cache key and scope to specify the entry for the cached token. --> <CacheKey> <Prefix/> <KeyFragment>gcp_translate_token_</KeyFragment> </CacheKey> <Scope>Exclusive</Scope> <!-- Assign the retrieved token (if any) to a variable, where it can be retrieved by policies. --> <AssignTo>cloud.translation.auth.token</AssignTo> </LookupCache>キャッシュ検索でキャッシュに保存されたトークンが取得されなかった場合、次の ExtensionCallout ポリシーは新しい OAuth トークンを取得し、トークンのスコープとして Google Cloud Translation API を指定します。
Google-Auth-Callout拡張機能の構成時に使用されたサービス アカウントの認証情報が、API にアクセスできるプロジェクト メンバーを表している場合、Google Cloud は有効なトークンを返します。<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ConnectorCallout async="false" continueOnError="true" enabled="true" name="Google-Auth-Callout"> <DisplayName>Google-Auth-Callout</DisplayName> <Connector>example-auth-extension</Connector> <Action>getOauth2AccessToken</Action> <Input><![CDATA[{ "scope" : ["https://www.googleapis.com/auth/cloud-translation"] }]]></Input> <Output parsed="false">cloud.translation.auth.token</Output> </ConnectorCallout>ExtensionCallout ポリシーが新しいトークンを取得すると、PopulateCache ポリシーがそのトークンをキャッシュに保存し、API プロキシのポリシーで後で使用できるようにします。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <PopulateCache async="false" continueOnError="false" enabled="true" name="Cache-Auth-Token"> <DisplayName>Cache Auth Token</DisplayName> <Properties/> <!-- Set cache key information to specify a unique key for this entry. --> <CacheKey> <Prefix/> <KeyFragment>gcp_translate_token_</KeyFragment> </CacheKey> <Scope>Exclusive</Scope> <ExpirySettings> <TimeoutInSec>5</TimeoutInSec> </ExpirySettings> <!-- Get the token to cache from the variable where the ExtensionCallout put it. --> <Source>cloud.translation.auth.token</Source> </PopulateCache>
操作
getOauth2AccessToken
OAuth 2.0 アクセス トークンを取得します。このアクションは、Google API で OAuth トークンが必要な場合に、API プロキシと Google API 間の Two-legged OAuth をサポートするために使用します。
Two-legged OAuth では、この拡張機能アクションは、サービス アカウント JSON を使用して Google で認証することで OAuth トークンを取得します(この拡張機能を構成するときに JSON を追加します)。このアクションで OAuth トークンが取得されると、API プロキシはトークンを使用して Google API を呼び出すことができます。これにより、Google サービス アカウントに代わって API が呼び出されます。
Google Cloud APIs へのアクセスは、Google API の OAuth 2.0 スコープに記載されているスコープでフィルタされます。
OAuth 2.0 を使用したサーバー間インタラクションの詳細については、サーバー間アプリケーションでの OAuth 2.0 の使用をご覧ください。
構文
<Action>getOauth2AccessToken</Action>
<Input><![CDATA[{
"scope" : [
"scope1",
"scope2"
]
}]]></Input>
例
次の例では、拡張機能の getOauth2AccessToken アクションで Cloud Translation API へのリクエストに使用するトークンを取得します。
<Action>getOauth2AccessToken</Action>
<Input><![CDATA[{
"scope" : [
"https://www.googleapis.com/auth/cloud-translation"
]
}]]></Input>
リクエスト パラメータ
| パラメータ | 説明 | 型 | デフォルト | 必須 |
|---|---|---|---|---|
| スコープ | OAuth 2.0 スコープの配列。スコープの詳細については、Google API 用の OAuth 2.0 スコープをご覧ください。 | 配列 | ["https://www.googleapis.com/auth/cloud-platform"]。サービス アカウントがアクセスできるすべての API へのアクセスを許可します。 |
いいえ。 |
レスポンス
アクセス トークン、そのタイプ、有効期限を含むオブジェクト。形式は次のとおりです。
{
"accessToken": "ewogICJ0eXB...C5jb20iCn0K",
"token_type": "Bearer",
"expiresInSec": 3600
}
レスポンス プロパティ
| パラメータ | 説明 | デフォルト | 必須 |
|---|---|---|---|
| accessToken | OAuth 2.0 アクセス トークン。 | なし | ○ |
| tokenType | トークンのタイプ。 | Bearer | ○ |
| expiresInSec | トークンの有効期限が切れるまでの秒数。 | 3600 | ○ |
getJWTAccessToken
JSON ウェブトークン(JWT)アクセストークンを取得します。このトークンは、呼び出す API のサービス定義が Google APIs GitHub リポジトリに公開されている場合に、Google APIs での認証に使用できます。
一部の Google API では、OAuth 2.0 アクセス トークンの代わりに、署名付き JWT を署名なしトークンとして直接使用して、承認済み API 呼び出しを行うことができます。この方法を使用すると、API 呼び出しを行う前に Google の承認サーバーにネットワーク リクエストを行う必要がなくなります。
JWT アクセス トークンを使用した認証の詳細については、サーバー間アプリケーションでの OAuth 2.0 の使用をご覧ください。
構文
<Action>getJWTAccessToken</Action>
<Input><![CDATA[{
"audience" : "audience"
}]]></Input>
例: Cloud Functions の URL
次の例では、拡張機能の getOauth2AccessToken アクションで Cloud Translation API へのリクエストに使用するトークンを取得します。
<Action>getJWTAccessToken</Action>
<Input><![CDATA[{
"audience" : "https://YOUR_REGION-YOUR_PROJECT_ID.cloudfunctions.net/FUNCTION_NAME"
}]]></Input>
例: Cloud IAP でセキュリティ保護されたクライアント ID
次の例では、拡張機能の getOauth2AccessToken アクションで Cloud Translation API へのリクエストに使用するトークンを取得します。
<Action>getJWTAccessToken</Action>
<Input><![CDATA[{
"audience" : "Cloud-IAP-secured-client-ID"
}]]></Input>
リクエスト パラメータ
| パラメータ | 説明 | デフォルト | 必須 |
|---|---|---|---|
| audience | トークンの受信者。これには、Cloud IAP でセキュリティ保護されたクライアント ID、Cloud Functions の URL などが含まれます。 | なし | ○ |
レスポンス
{
"accessToken": "token",
"tokenType": "Bearer",
"expiresInSec": 3600
}
レスポンス プロパティ
| パラメータ | 説明 | デフォルト | 必須 |
|---|---|---|---|
| accessToken | アクセス トークン。 | なし | ○ |
| tokenType | トークンのタイプ。 | Bearer | ○ |
| expiresInSec | 有効期限(秒単位)。 | 3600 | ○ |
構成リファレンス
この拡張機能を API プロキシで使用するように構成してデプロイする場合は、以下のプロパティを使用します。Apigee Console で拡張機能を構成する手順については、拡張機能の追加と構成をご覧ください。
拡張機能の共通プロパティ
すべての拡張機能には次のプロパティがあります。
| プロパティ | 説明 | デフォルト | 必須 |
|---|---|---|---|
name |
この拡張機能に付ける名前。 | なし | ○ |
packageName |
Apigee Edge から提供された拡張機能パッケージの名前。 | なし | ○ |
version |
拡張機能を構成する拡張機能パッケージのバージョン番号。 | なし | ○ |
configuration |
追加する拡張機能に固有の構成値。この拡張機能パッケージのプロパティをご覧ください。 | なし | ○ |
この拡張機能パッケージのプロパティ
この拡張機能に固有の次の構成プロパティの値を指定します。
| プロパティ | 説明 | デフォルト | 必須 |
|---|---|---|---|
| credentials | Apigee Edge コンソールに入力する場合は、サービス アカウント キーの JSON ファイルの内容全体を指定します。管理 API で設定される場合、サービス アカウント キーの JSON ファイル全体から生成された base64 エンコード値になります。 | なし | ○ |