Google 認証拡張機能

Apigee Edge のドキュメントが表示されています。
Apigee X のドキュメントに移動します。
情報

バージョン: 2.0.0

指定した Google API へのアクセスについて、Google で認証します。

この拡張機能を使用して Google Cloud サービスのトークン(OAuth または JWT)を取得し、ServiceCallout ポリシーなどを使用して、後続の Google API 呼び出しでトークンを使用します。

たとえば、API プロキシでこの拡張機能を使用してトークンを取得し、PopulateCache ポリシーを使用してトークンをキャッシュに保存してから、ServiceCallout ポリシーを使用してトークンを渡し、API プロキシフロー内から Google Cloud サービスにアクセスできます。

前提条件

このコンテンツでは、この拡張機能を構成して使用するためのリファレンスを提供します。ExtensionCallout ポリシーを使用して API プロキシから拡張機能を使用する前に、次の操作を行う必要があります。

  1. 拡張機能が使用するアカウント(認証情報に使用するサービス アカウントで表されるアカウント)が、拡張機能が認証を行う Google Cloud サービスにアクセスできることを確認します。

  2. Google Cloud コンソールを使用して、サービス アカウントのキーを生成します。

  3. 構成リファレンスを使用して拡張機能を追加して構成するときは、生成されたサービス アカウント キーの JSON ファイルの内容を使用します。

Google Cloud での認証について

この拡張機能は、Google Cloud プロジェクトで定義された特定のメンバーを表すことで、Google Cloud から認証をリクエストします。この拡張機能を構成するときに、そのプロジェクト メンバーのサービス アカウント JSON ファイルを使用します。

その結果、この拡張機能は、そのメンバーに権限が付与されているリソースにのみアクセスできるようになります。つまり、この拡張機能による認証が成功するかどうかは、Google Cloud コンソールで付与された権限と、実行時に拡張機能によってリクエストされたアクセス(スコープまたはオーディエンス経由)が一致するかどうかによって決まります。

一般に、この拡張機能から API へのアクセスを認証する手順は次のようになります。

  1. この拡張機能が表すメンバー サービス アカウントが、アクセスする Google リソースにアクセスできることを確認します。Google Cloud コンソールの Cloud Identity and Access Management(Cloud IAM)ページを使用して、この拡張機能が表すプロジェクト メンバーにロールを付与できます。

  2. この拡張機能を構成するときに、そのメンバーのサービス アカウント キーの JSON を使用します。

  3. この拡張機能を使用するように 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>
  1. 次の 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>
    
  2. キャッシュ ルックアップでキャッシュに保存されたトークンが取得されなかった場合、次の 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>
    
  3. 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 コンソールを使用して拡張機能を構成する手順については、拡張機能を追加して構成するをご覧ください。

共通の拡張プロパティ

すべての拡張機能には次のプロパティがあります。

プロパティ 説明 デフォルト 必須
name この拡張機能に付ける名前。 なし ○
packageName Apigee Edge から提供された拡張機能パッケージの名前。 なし ○
version 拡張機能を構成する拡張機能パッケージのバージョン番号。 なし ○
configuration 追加する拡張機能に固有の構成値。この拡張機能パッケージのプロパティをご覧ください。 なし ○

この拡張パッケージのプロパティ

この拡張機能に固有の次の構成プロパティの値を指定します。

プロパティ 説明 デフォルト 必須
credentials Apigee Edge コンソールに入力する場合、これはサービス アカウント キーの JSON ファイルの内容全体です。管理 API を使用して送信される場合、サービス アカウント キーの JSON ファイル全体から生成された base64 エンコード値になります。 なし ○