Расширение аутентификации Google

Вы просматриваете документацию Apigee Edge .
Перейти к документации Apigee X.
info

Версия: 2.0.1

Пройдите аутентификацию в Google для доступа к указанным вами API Google .

Используйте это расширение для получения токена (OAuth или JWT) для сервисов Google Cloud, а затем используйте токен для последующих вызовов API Google, например, с помощью политики ServiceCallout .

Например, в API-прокси вы можете получить токен с этим расширением, кэшировать токен с помощью политики PopulateCache , а затем передать токен через политику ServiceCallout для доступа к службам Google Cloud из потока API-прокси.

Предпосылки

Этот контент предоставляет справочную информацию по настройке и использованию этого расширения. Перед использованием расширения из API-прокси с помощью политики ExtensionCallout необходимо:

  1. Убедитесь, что учетная запись, которую будет использовать расширение (учетная запись, представленная учетной записью службы, которую вы будете использовать для учетных данных), имеет доступ к службам Google Cloud, в которых расширение будет проходить аутентификацию.

  2. Используйте Google Cloud Console для генерации ключа для учетной записи службы .

  3. Используйте содержимое полученного JSON-файла ключа учетной записи службы при добавлении и настройке расширения с помощью ссылки на конфигурацию .

Об аутентификации с помощью Google Cloud

Это расширение запрашивает аутентификацию из Google Cloud, представляя определенного участника, определенного в вашем проекте Google Cloud . Вы используете файл JSON учетной записи службы этого участника проекта при настройке этого расширения.

В результате это расширение будет иметь доступ только к тем ресурсам, на которые у этого участника есть разрешение. Другими словами, успешная аутентификация этим расширением зависит от соответствия между разрешениями, предоставленными в Google Cloud Console, и доступом, запрошенным расширением (через области действия или аудиторию) во время выполнения.

Как правило, ваши шаги по аутентификации для доступа к API из этого расширения будут следующими:

  1. Убедитесь, что учетная запись службы участника, которую представляет это расширение, имеет доступ к ресурсу Google, к которому вы хотите получить доступ. Вы можете использовать страницу Cloud Identity and Access Management (Cloud IAM) в Google Cloud Console, чтобы предоставить роли участнику проекта, которого представляет это расширение.

  2. При настройке этого расширения используйте ключ учетной записи службы этого участника в формате JSON.

  3. При настройке политики ExtensionCallout для использования этого расширения запрашивайте аутентификацию только для тех ресурсов, к которым имеет доступ ваш участник проекта.

Образцы

В следующих примерах показано, как выполнить аутентификацию в Google Cloud с использованием политики ExtensionCallout .

Получить токен доступа

В следующем примере действие расширения getOauth2AccessToken извлекает токен для использования в запросах к 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-прокси иллюстрирует, как установить и использовать кэшированный токен для вызова API Google Translation с политикой ServiceCallout . Каждый пример кода здесь предназначен для другой политики в потоке.

Следующие политики выполняются в последовательности, описанной следующим потоком 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. Если поиск в кэше не извлекает кэшированный токен, следующая политика ExtensionCallout извлекает новый токен OAuth, указывая API перевода Google Cloud в качестве области действия токена. Google Cloud возвращает действительный токен, если учетные данные учетной записи службы, используемые при настройке расширения Google-Auth-Callout представляют участника проекта, имеющего доступ к API.

      <?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>
    

Действия

получитьOauth2AccessToken

Получает токен доступа OAuth 2.0. Используйте это действие для поддержки двухстороннего OAuth между вашим API-прокси и API Google, когда API Google требуют токен OAuth.

В двунаправленном OAuth это действие расширения извлекает токен OAuth, аутентифицируясь в Google с использованием JSON учетной записи службы (вы добавляете этот JSON при настройке этого расширения). После того, как это действие извлекает токен OAuth, ваш API-прокси может использовать токен для совершения вызовов API Google, фактически вызывая API от имени учетной записи службы Google.

Доступ к API Google Cloud фильтруется по областям, перечисленным в областях действия OAuth 2.0 для API Google .

Дополнительную информацию о взаимодействии серверов с OAuth 2.0 см. в разделе Использование OAuth 2.0 для приложений «сервер-сервер».

Синтаксис

<Action>getOauth2AccessToken</Action>
<Input><![CDATA[{
  "scope" : [
    "scope1",
    "scope2"
  ]
}]]></Input>

Пример

В следующем примере действие расширения getOauth2AccessToken извлекает токен для использования в запросах к API облачного перевода .

<Action>getOauth2AccessToken</Action>
<Input><![CDATA[{
    "scope" : [
      "https://www.googleapis.com/auth/cloud-translation"
  ]
}]]></Input>

Параметры запроса

Параметр Описание Тип По умолчанию Необходимый
объем Массив областей действия OAuth 2.0. Подробнее об областях действия см. в разделе Области действия OAuth 2.0 для API Google . Множество ["https://www.googleapis.com/auth/cloud-platform"] , который предоставляет доступ ко всем API, к которым имеет доступ учетная запись службы. Нет.

Ответ

Объект, содержащий токен доступа, его тип и дату истечения срока действия в следующей форме:

{
  "accessToken": "ewogICJ0eXB...C5jb20iCn0K",
  "token_type": "Bearer",
  "expiresInSec": 3600
}

Свойства ответа

Параметр Описание По умолчанию Необходимый
accessToken Токен доступа OAuth 2.0. Никто Да
tokenType Тип токена. Предъявитель Да
истекаетInSec Количество секунд до истечения срока действия токена. 3600 Да

получитьJWTAccessToken

Получает токен доступа JSON web token (JWT). Вы можете использовать этот токен для аутентификации с помощью API Google, если API, который вы хотите вызвать, имеет определение службы, опубликованное в репозитории API Google GitHub .

С некоторыми API Google вы можете делать авторизованные вызовы API, используя подписанный JWT напрямую в качестве токена-носителя, а не токена доступа OAuth 2.0. Когда это возможно, вы можете избежать необходимости делать сетевой запрос на сервер авторизации Google перед выполнением вызова API.

Дополнительную информацию об аутентификации с помощью токена доступа JWT см. в разделе Использование OAuth 2.0 для межсерверных приложений .

Синтаксис

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

Пример: URL-адрес облачной функции

В следующем примере действие расширения getOauth2AccessToken извлекает токен для использования в запросах к API облачного перевода .

<Action>getJWTAccessToken</Action>
<Input><![CDATA[{
  "audience" : "https://YOUR_REGION-YOUR_PROJECT_ID.cloudfunctions.net/FUNCTION_NAME"
}]]></Input>

Пример: идентификатор клиента, защищенный IAP в облаке

В следующем примере действие расширения getOauth2AccessToken извлекает токен для использования в запросах к API облачного перевода .

<Action>getJWTAccessToken</Action>
<Input><![CDATA[{
  "audience" : "Cloud-IAP-secured-client-ID"
}]]></Input>

Параметры запроса

Параметр Описание По умолчанию Необходимый
аудитория Предполагаемый получатель токена. Это может включать защищенный Cloud IAP идентификатор клиента, URL-адрес Cloud Functions и т. д. Никто Да

Ответ

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

Свойства ответа

Параметр Описание По умолчанию Необходимый
accessToken Токен доступа. Никто Да
tokenType Тип токена. Предъявитель Да
истекаетInSec Срок действия истекает через несколько секунд. 3600 Да

Ссылка на конфигурацию

Используйте следующее при настройке и развертывании этого расширения для использования в API-прокси. Действия по настройке расширения с помощью консоли Apigee см. в разделе Добавление и настройка расширения .

Общие свойства расширения

Следующие свойства присутствуют для каждого расширения.

Свойство Описание По умолчанию Необходимый
name Имя, которое вы даете этой конфигурации расширения. Никто Да
packageName Имя пакета расширения, предоставленное Apigee Edge. Никто Да
version Номер версии пакета расширения, из которого вы настраиваете расширение. Никто Да
configuration Значение конфигурации, относящееся к добавляемому расширению. См. Свойства этого пакета расширения. Никто Да

Свойства этого пакета расширения

Укажите значения для следующих свойств конфигурации, специфичных для этого расширения.

Свойство Описание По умолчанию Необходимый
реквизиты для входа При вводе в консоли Apigee Edge это все содержимое файла JSON ключа учетной записи службы. При отправке через API управления это значение в кодировке base64, сгенерированное из всего файла JSON ключа учетной записи службы. Никто Да