Google 認証拡張機能

<ph type="x-smartling-placeholder"></ph> 現在、Apigee Edge のドキュメントが表示されています。
Apigee X のドキュメント
詳細

<ph type="x-smartling-placeholder">

バージョン: 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 ポリシーで、Google Cloud Translation API をトークンのスコープとして指定して、新しい OAuth トークンを取得します。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>
    

操作

<ph type="x-smartling-placeholder">

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 トークンのタイプ。 ベアラー
expiresInSec トークンの有効期限が切れるまでの秒数。 3600

getJWTAccessToken

JSON Web Token(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 トークンのタイプ。 ベアラー
expiresInSec 秒単位で期限切れになります。 3600

構成リファレンス

API プロキシで使用するためにこの拡張機能を構成してデプロイする場合は、以下を使用します。Apigee コンソールを使用して拡張機能を構成する手順については、拡張機能の追加と構成をご覧ください。

拡張機能の一般的なプロパティ

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

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

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

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

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