Как реализовать тип предоставления пароля

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

Тип предоставления "пароль владельца ресурса" (или просто "пароль") в основном используется в случаях, когда приложение является надежным. В этой конфигурации пользователь предоставляет свои учетные данные сервера ресурсов (имя пользователя и пароль) клиентскому приложению, которое отправляет их в запросе токена доступа в Apigee Edge. Сервер идентификации проверяет учетные данные и, если они действительны, Edge создает токен доступа и возвращает его приложению.

Об этой теме

В этой статье приведено общее описание и обзор процесса предоставления пароля владельца ресурса OAuth 2.0, а также рассказывается, как реализовать этот процесс в Apigee Edge.

Примеры, которые могут быть вам полезны

  • Запрос токена доступа: тип предоставления пароля. В этом разделе рассказывается, как сформировать запрос токена, настроить правило OAuthV2 для типа предоставления пароля и настроить конечную точку для правила в Edge.
  • oauth-validate-key-secret – пример прокси-сервера на GitHub, который можно развернуть в Edge и протестировать. Это полный пример, в котором используется тип предоставления пароля. В нем показано, как правильно аутентифицировать учетные данные клиентского приложения (ключ/секрет), прежде чем отправлять учетные данные пользователя поставщику идентификационной информации.

Видео

Видео. Посмотрите видео о том, как реализовать тип предоставления пароля.

Примеры использования

Этот тип авторизации предназначен для приложений с высоким уровнем доверия или привилегиями, поскольку пользователю необходимо предоставить приложению учетные данные сервера ресурсов. Обычно приложение показывает экран входа, на котором пользователь вводит свои учетные данные.

Блок-схема

На приведенной ниже диаграмме показан поток предоставления пароля владельца ресурса с Apigee Edge в качестве сервера авторизации.

Совет. Чтобы посмотреть увеличенную версию этой диаграммы, нажмите на нее правой кнопкой мыши и откройте в новой вкладке или сохраните и откройте в программе просмотра изображений.

Этапы процесса с типом предоставления пароля

Ниже кратко описаны шаги по реализации типа предоставления пароля, при котором Apigee Edge выступает в качестве сервера авторизации.

Требование. Клиентское приложение должно быть зарегистрировано в Apigee Edge, чтобы получить идентификатор клиента и секретные ключи клиента. Подробнее о регистрации клиентских приложений…

1. Пользователь инициирует процесс и вводит учетные данные.

Когда приложению требуется доступ к защищенным ресурсам пользователя (например, когда пользователь нажимает кнопку в приложении), он перенаправляется на форму входа.

2. Приложение запрашивает маркер доступа у Apigee Edge

Приложение отправляет запрос на получение токена доступа, включая учетные данные пользователя, в конечную точку GenerateAccessToken в Apigee Edge.

Ниже приведен пример запроса POST, в котором указаны обязательные параметры для этого типа авторизации:

$ curl -i \
  -X POST \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'Authorization: Basic c3FIOG9vSGV4VHo4QzAySVg5T1JvNnJoZ3ExaVNyQWw6WjRsanRKZG5lQk9qUE1BVQ' \
  -d 'grant_type=password&username=the-user-name&password=the-users-password' \
  https://docs-test.apigee.net/oauth/token

Также можно использовать следующую команду, в которой параметр -u в curl создает заголовок базовой аутентификации с кодировкой Base64.

$ curl -i \
  -X POST \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -u sqH8ooHexTz8C02IX9ORo6rhgq1iSrAl:Z4ljtJdneBOjPMAU \
  -d 'grant_type=password&username=the-user-name&password=the-users-password' \
  https://docs-test.apigee.net/oauth/token

(Каждая из этих команд должна быть указана в одной строке.)

Учетные данные пользователя содержатся в параметрах формы, а учетные данные клиента закодированы в заголовке базовой аутентификации HTTP. Подробное описание этого вызова API, в том числе сведения о необходимом заголовке Basic Auth, можно найти в разделе "Предоставление пароля" статьи Как запросить токены доступа и коды авторизации.

3. Edge проверяет клиентское приложение

Прежде чем отправлять имя пользователя и пароль поставщику идентификационной информации, Edge должен убедиться, что клиентское приложение, отправляющее запрос, является действительным и надежным. Один из способов сделать это – использовать аутентификацию по ключу API при вызове API. В некоторых случаях может потребоваться проверить и ключ клиента, и секретный код. Пример прокси-сервера, который демонстрирует этот альтернативный метод, можно найти в репозитории api-platform-samples на GitHub.

4. Edge обрабатывает учетные данные для входа

После проверки клиентского приложения вы можете использовать правило Service Callout или JavaScript, чтобы вызвать сервис идентификации и отправить учетные данные пользователя. Например, это может быть сервис LDAP или любой другой сервис, который вы хотите использовать для проверки учетных данных. Подробнее об этих правилах можно узнать в статьях Правила извлечения переменных и Правила JavaScript.

Если сервис идентификации подтверждает учетные данные и возвращает ответ 200, Edge продолжает обработку запроса. В противном случае Edge прекращает обработку и возвращает клиенту ошибку.

5. Выполняется правило OAuthV2.

Если учетные данные действительны, следующим шагом обработки будет выполнение правила OAuthV2, настроенного для типа предоставления пароля. Вот пример: Элементы <UserName> и <PassWord> являются обязательными. Их можно получить из переменных потока, сохраненных с помощью правила ExtractVariables. Подробную справочную информацию об этих правилах можно найти в разделе Правила OAuthV2.

<OAuthV2 name="GetAccessToken">
  <Operation>GenerateAccessToken</Operation>
  <ExpiresIn>360000000</ExpiresIn> 
  <SupportedGrantTypes> 
     <GrantType>password</GrantType> 
  </SupportedGrantTypes> 
  <GrantType>request.queryparam.grant_type</GrantType> 
  <UserName>login</UserName>
  <PassWord>password</PassWord>
  <GenerateResponse/> 
</OAuthV2>

Если правило выполнено успешно, клиенту отправляется ответ, содержащий токен доступа. Ответ будет в формате JSON. Вот пример. Обратите внимание, что access_token – один из элементов:

{
    "issued_at": "1420258685042",
    "scope": "READ",
    "application_name": "ce1e94a2-9c3e-42fa-a2c6-1ee01815476b",
    "refresh_token_issued_at": "1420258685042",
    "status": "approved",
    "refresh_token_status": "approved",
    "api_product_list": "[PremiumWeatherAPI]",
    "expires_in": "1799",
    "developer.email": "tesla@weathersample.com",
    "organization_id": "0",
    "token_type": "BearerToken",
    "refresh_token": "IFl7jlijYuexu6XVSSjLMJq8SVXGOAAq",
    "client_id": "5jUAdGv9pBouF0wOH5keAVI35GBtx3dT",
    "access_token": "I6daIgMSiUgYX1K2qgQWPi37ztS6",
    "organization_name": "docs",
    "refresh_token_expires_in": "0",
    "refresh_count": "0"
}

6. Клиент вызывает защищенный API

Теперь клиент может вызывать защищенный API, используя действительный код доступа. В этом случае запросы отправляются в Apigee Edge (прокси-сервер), и Edge отвечает за проверку токена доступа перед передачей вызова API целевому серверу ресурсов. Токены доступа передаются в заголовке Authorization. Пример:

$ curl -H "Authorization: Bearer I6daIgMSiUgYX1K2qgQWPi37ztS6
" http://{org_name}-test.apigee.net/weather/forecastrss?w=12797282