Cómo implementar el tipo de otorgamiento de contraseña

Esta página se aplica a Apigee y Apigee Hybrid.

Consulta la documentación de Apigee Edge.

El tipo de otorgamiento de contraseña de propietario de recurso (o “contraseña”) se usa, en su mayoría, en los casos en que la app es muy confiable. En esta configuración, el usuario proporciona sus credenciales de servidor de recursos (nombre de usuario/contraseña) a la app cliente, que las envía en una solicitud de token de acceso a Apigee Edge. Un servidor de identidad valida las credenciales y, si son válidas, Apigee procede a crear un token de acceso y lo muestra a la app.

Acerca de este tema

En este tema, se ofrece una descripción general del flujo del tipo de otorgamiento de contraseñas de propietario de recursos de OAuth 2.0, y se explica cómo implementar este flujo en Apigee.

Ejemplos que podrían resultarte útiles

  • Usa el tipo de otorgamiento de contraseña: Se muestra cómo formar una solicitud de token, configurar la política OAuthV2 para el tipo de otorgamiento de contraseña y cómo configurar un extremo para la política en Apigee.
  • oauth-validate-key-secret: Un proxy de muestra en GitHub que puedes implementar en Apigee y, luego, probarlo. Es un ejemplo de extremo a extremo con el tipo de otorgamiento de contraseña. Demuestra una práctica recomendada, que es autenticar las credenciales de la app cliente (clave/secreto) antes de enviar las credenciales del usuario a un proveedor de identidad.

Video

Video: Mira este video sobre cómo implementar el tipo de otorgamiento de contraseña.

Casos prácticos

Este tipo de otorgamiento está destinado a aplicaciones de alta confianza o privilegiadas porque el usuario debe proporcionar sus credenciales del servidor de recursos a la aplicación. Por lo general, la app proporciona una pantalla de acceso en la que el usuario ingresa sus credenciales.

Diagrama de flujo

En el siguiente diagrama de flujo, se ilustra el flujo de tipo de otorgamiento de contraseña de propietario del recurso con la entrega de Apigee como servidor de autorización.

Sugerencia: A fin de ver una versión más grande de este diagrama, haz clic con el botón derecho para abrirlo en una pestaña nueva. También puedes guardarlo y abrirlo en un visor de imágenes.

Flujo de tipo de otorgamiento de contraseña de propietario del recurso.

Pasos del flujo de tipo otorgamiento de contraseñas

Este es un resumen de los pasos necesarios para implementar el tipo de otorgamiento de contraseña donde Apigee sirve como servidor de autorización.

Requisito: La app cliente debe estar registrada en Apigee para obtener el ID de cliente y las claves del secreto del cliente. Consulta Cómo registrar apps cliente para obtener más detalles.

1. El usuario inicia el flujo y, luego, ingresa las credenciales

Cuando la app necesita acceder a los recursos protegidos del usuario (por ejemplo, cuando el usuario hace clic en un botón de la app), se redirecciona al usuario a un formulario de acceso.

2. La app solicita un token de acceso de Apigee Edge

La app envía una solicitud de token de acceso, incluidas las credenciales del usuario, a un extremo de GenerateAccessToken en Apigee.

A continuación, se muestra una solicitud POST de ejemplo, que incluye los parámetros necesarios para este tipo de otorgamiento:

$ 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

De manera alternativa, ese comando podría realizarse de la siguiente manera, con la opción -u para curl a fin de crear el encabezado de autenticación básica codificado en base64 por ti.

$ 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

(Todos estos comandos deben estar en una línea).

Las credenciales de usuario se encuentran en los parámetros de forma, mientras que las credenciales de cliente están codificadas en el encabezado de autenticación básico HTTP. Para obtener una descripción detallada de esta llamada a la API, incluidos los detalles sobre el encabezado de autenticación básico requerido, consulta la sección de concesión de contraseña de “Obtén tokens de OAuth 2.0”.

3. Apigee valida la app del cliente.

Antes de enviar el nombre de usuario y la contraseña del usuario a un proveedor de identidad, Edge necesita saber que la app cliente que realiza la solicitud es una app válida y confiable. Una forma de hacerlo es usar la autenticación de la clave de API en la llamada a la API. En algunos casos, es posible que desees validar tanto la clave como el secreto del cliente. Hay un proxy de muestra que ilustra esta técnica generalizada en el repositorio api-platform-samples en GitHub.

4. Apigee procesa las credenciales de acceso

Después de validar la app cliente, puedes usar una política de JavaScript o texto destacado de servicio para llamar al servicio de identidad y enviar las credenciales del usuario. Por ejemplo, podría ser un servicio de LDAP o cualquier servicio que quieras usar para validar las credenciales. Para obtener detalles sobre estas políticas, consulta la Política de extracción de variables y la política de JavaScript.

Si el servicio de identidad valida las credenciales y muestra una respuesta 200, Apigee seguirá procesando la solicitud. De lo contrario, Apigee deja de procesarse y muestra un error en la app cliente.

5. Ejecución de la política de OAuthV2

Si las credenciales son válidas, el siguiente paso de procesamiento es ejecutar una política de OAuthV2 configurada para el tipo de otorgamiento de contraseña. A continuación, se muestra un ejemplo. Los elementos <UserName> y <PassWord> son obligatorios y puedes recuperarlos de las variables de flujo que se guardaron con la política ExtractVariables. Para obtener información de referencia detallada sobre esta política, consulta la política de 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>

Si esta política tiene éxito, se genera una respuesta al cliente que contiene un token de acceso. La respuesta está en formato JSON. A continuación, se muestra un ejemplo. Ten en cuenta que access_token es uno de los elementos:

{
    "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. El cliente llama a la API protegida

Ahora, con un código de acceso válido, el cliente puede realizar llamadas a la API protegida. En este caso, las solicitudes se realizan a Apigee (el proxy) y Apigee es responsable de validar el token de acceso antes de pasar la llamada a la API al servidor de recursos de destino. Los tokens de acceso se pasan en un encabezado de autorización. Por ejemplo:

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