Google 驗證擴充功能

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

版本:1.3.1

向 Google 驗證,以存取您指定的 Google API

使用這項擴充功能取得 Google Cloud 服務的權杖 (OAuth 或 JWT),然後將權杖用於後續呼叫 Google API,例如使用 Service callout 政策

舉例來說,在 API Proxy 中,您可能會透過這個擴充功能取得權杖,使用 PopulateCache 政策快取權杖,然後透過 Service callout 政策傳遞權杖,以便在 API Proxy 流程中存取 Google Cloud 服務。

必要條件

這項內容提供設定與使用這項擴充功能的參考資源。透過 Extension 摘要政策使用 API Proxy 擴充功能之前,您必須:

  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. 如果設定 Extension callout 政策來使用這項擴充功能,請僅要求專案成員有權存取的資源進行驗證。

範例

以下範例說明如何使用 Extension callout 政策,向 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 政策會從上述 Extension callout 政策中擷取回應值,並在回應酬載中複製這個值。這項功能在偵錯時相當實用。在實務上,建議您不要將權杖傳回用戶端。

<?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 Proxy 程式碼,瞭解如何設定及使用快取權杖,搭配「服務呼叫」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 Proxy 使用。

      <?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. 如果快取查詢未擷取快取權杖,下列 Extension callout 政策會擷取新的 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. Extension callout 政策擷取新權杖後,PopulateCache 政策會快取該權杖,以供 API Proxy 的政策使用。

      <?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 Proxy 和 Google API 之間支援雙足式 OAuth。

在雙足式 OAuth 中,這項擴充功能動作會使用服務帳戶 JSON 向 Google 進行驗證,藉此擷取 OAuth 權杖 (請在設定這項擴充功能時新增該 JSON)。這個動作擷取 OAuth 權杖後,您的 API Proxy 即可使用權杖呼叫 Google API,有效代表 Google 服務帳戶呼叫 API。

Google Cloud API 的存取權是透過 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,直接使用已簽署的 JWT 做為不記名權杖 (而非 OAuth 2.0 存取權杖) 進行授權的 API 呼叫。如果可行的話,您就可以避免在發出 API 呼叫之前,先向 Google 的授權伺服器發出網路要求。

如要進一步瞭解如何使用 JWT 存取權杖進行驗證,請參閱「針對伺服器對伺服器應用程式使用 OAuth 2.0」一文。

語法

<Action>getJWTAccessToken</Action>
<Input><![CDATA[{
    "audience" : "audience"
}]]></Input>

範例:Cloud 函式網址

在以下範例中,擴充功能的 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 網址等。

回應

{
  "accessToken": "token",
  "tokenType": "Bearer",
  "expiresInSec": 3600
}

回應屬性

參數 說明 預設 必填
accessToken 存取權杖。
tokenType 權杖類型。 承載系統
expiresInSec 幾秒內就會到期。 3600

設定參考資料

設定及部署這項擴充功能以用於 API Proxy 時,請使用下列指令。如需使用 Apigee 控制台設定擴充功能的步驟,請參閱新增及設定擴充功能

常見擴充功能屬性

每個擴充功能都有下列屬性。

屬性 說明 預設 必要
name 您要為這項擴充功能設定的名稱。 相容
packageName Apigee Edge 指定的擴充功能套件名稱。 相容
version 擴充功能的擴充功能套件版本號碼。 相容
configuration 您要新增的擴充功能專屬的設定值。請參閱「這個擴充功能套件的屬性」一文 相容

這個擴充功能套件的屬性

指定這個擴充功能專用的下列設定屬性值。

屬性 說明 預設 必填
憑證 在 Apigee Edge 控制台中輸入後,這是服務帳戶金鑰 JSON 檔案的全部內容。透過 Management API 傳送時,這是由整個服務帳戶金鑰 JSON 檔案產生的 Base64 編碼值。