Google 認証拡張機能

現在、Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントをご確認ください
情報

バージョン: 1.3.1

指定した Google API へのアクセスを Google で認証します。

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

たとえば、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 ポリシーが新しいトークンを取得すると、後で API プロキシのポリシーで使用できるように、PopulateCache ポリシーによってトークンをキャッシュに保存します。

      <?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(この拡張機能を構成するときに JSON を追加します)を使用して Google での認証を行い、OAuth トークンを取得します。この操作で 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 API GitHub リポジトリで公開されているサービス定義がある場合、このトークンを Google API での認証に使用できます。

一部の 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>

リクエスト パラメータ

パラメータ 説明 デフォルト 必須
ユーザーリスト トークンの受信者。これには、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 追加する拡張機能に固有の構成値。この拡張機能パッケージのプロパティをご覧ください。 なし

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

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

プロパティ 説明 デフォルト 必須
証明書 Apigee Edge コンソールで入力した場合、これはサービス アカウント キーの JSON ファイルの内容全体です。Management API 経由で送信される場合は、サービス アカウント キーの JSON ファイル全体から生成された、Base64 でエンコードされた値です。 なし