Google Authentication 扩展程序

<ph type="x-smartling-placeholder"></ph> 您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
信息

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

版本:1.3.1

进行 Google 身份验证,以便访问您指定的 Google API

使用此扩展程序获取 Google Cloud 服务的令牌(OAuth 或 JWT),然后将令牌用于后续对 Google API 的调用(例如通过使用 ServiceCallout 政策)。

例如,在 API 代理中,您可能会获得具有此扩展程序的令牌,使用 PopulateCache 政策缓存令牌,然后通过 ServiceCallout 政策传递令牌,以从 API 代理流内访问 Google Cloud 服务。

前提条件

本文提供了配置和使用此扩展程序的参考信息。在通过 API 代理使用 ExtensionCallout 政策使用扩展程序之前,您必须:

  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>
    

操作

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

getOauth2AccessToken

获取 OAuth 2.0 访问令牌。当 Google API 需要 OAuth 令牌时,可以使用此操作支持 API 代理和 Google API 之间的两方模式 OAuth。

在两方模式的 OAuth 中,此扩展程序操作会使用服务账号 JSON(您在配置此扩展程序时添加该 JSON)进行 Google 身份验证,从而检索 OAuth 令牌。一旦此操作检索到 OAuth 令牌,您的 API 代理就可以使用该令牌调用 Google API,从而有效地代表 Google 服务账号调用 API。

系统会按照 Google API 的 OAuth 2.0 范围中列出的范围过滤对 Google Cloud API 的访问权限。

如需详细了解如何使用 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 网络令牌 (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 Functions 函数网址

在以下示例中,扩展程序的 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 代理中使用时,请使用以下代码。如需了解使用 Apigee 控制台配置扩展程序的步骤,请参阅添加和配置扩展程序

常见的扩展属性

每个扩展程序都有以下属性。

属性 说明 默认 必需
name 您为扩展程序配置此名称。
packageName Apigee Edge 提供的扩展包的名称。
version 配置扩展程序所用的扩展程序软件包的版本号。
configuration 特定于您要添加的附加信息的配置值。请参阅此扩展程序软件包的属性

此扩展程序软件包的属性

为此扩展程序的以下配置属性指定值。

属性 说明 默认 必填
凭据 在 Apigee Edge 控制台中输入时,这是服务账号密钥 JSON 文件的全部内容。通过 Management API 发送时,此值为根据整个服务账号密钥 JSON 文件生成的 base64 编码值。