Solicita tokens de acceso y códigos de autorización

Estás consultando la documentación de Apigee Edge.
Consulta la documentación de Apigee X.
Información

En este tema, te mostramos cómo solicitar tokens de acceso y códigos de autorización, configurar extremos de OAuth 2.0 y políticas para cada tipo de otorgamiento admitido.

Código de muestra

Para tu comodidad, las políticas y los extremos que se analizan en este tema están disponibles en GitHub, en el proyecto oauth-doc-examples, en el repositorio api-platform-samples de Apigee. Puedes implementar el código de muestra y probar las solicitudes de muestra que se presentan en este tema. Consulta el archivo README del proyecto para obtener más detalles.

Solicitud de un token de acceso: Tipo de otorgamiento de código de autorización

En esta sección, se explica cómo solicitar un token de acceso mediante el flujo de tipo de otorgamiento de código de autorización. Para obtener una introducción a los tipos de otorgamiento de OAuth 2.0, consulta Introducción a OAuth 2.0.

Solicitud de muestra

$ curl -i -H 'Content-Type: application/x-www-form-urlencoded' \
   -H 'Authorization: Basic c3FIOG9vSGV4VHo4QzAyg5T1JvNnJoZ3ExaVNyQWw6WjRsanRKZG5lQk9qUE1BVQ' \
   -X POST 'https://docs-test.apigee.net/oauth/accesstoken' \
   -d 'code=I9dMGHAN&grant_type=authorization_code&redirect_uri=http://example-callback.com'

Parámetros obligatorios

De forma predeterminada, estos parámetros deben ser x-www-form-urlencoded y especificarse en el cuerpo de la solicitud (como se muestra en el ejemplo anterior). Sin embargo, es posible cambiar este valor predeterminado configurando los elementos <GrantType>, <Code> y <RedirectUri> en la política OAuthV2 vinculada a este extremo /accesstoken. Para obtener más información, consulta la política de OAuthV2.

  • grant_type: debe configurarse con el valor authorization_code.
  • code: El código de autorización recibido del extremo /authorize (o el nombre que elijas). Para solicitar un token de acceso en el flujo de tipo de otorgamiento de código de autorización, primero debes obtener un código de autorización. Consulte Cómo solicitar códigos de autorización más abajo. Consulta también Cómo implementar el tipo de otorgamiento de código de autorización.
  • redirect_uri: Debes proporcionar este parámetro si se incluyó el parámetro redirect_uri en la solicitud de código de autorización previa. Si el parámetro redirect_uri no se incluyó en la solicitud de código de autorización, y si no proporcionas este parámetro, esta política usará el valor de la URL de devolución de llamada que se proporcionó cuando se registró la app del desarrollador.

Parámetros opcionales

  • state: es una string que se enviará con la respuesta. Por lo general, se usa para evitar ataques de falsificación de solicitudes entre sitios.
  • scope: permite filtrar la lista de productos de API con los que se puede usar el token acuñado. Para obtener información detallada sobre el alcance, consulta Trabaja con alcances de OAuth2.

Autenticación

Debes pasar el ID de cliente y el secreto de cliente como un encabezado de autenticación básica (codificado en Base64) o como los parámetros de formulario client_id y client_secret. Puedes obtener estos valores a partir de una app de desarrollador registrada. Consulta también "Codifica las credenciales de autenticación básicas".

Extremo de muestra

A continuación, se muestra una configuración de extremo de muestra para generar un token de acceso. Ejecutará la política GenerateAccessToken, que debe configurarse para admitir el tipo de otorgamiento de authorization_code.

...
       <Flow name="generate-access-token">
            <Description>Generate a token</Description>
            <Request>
                <Step>
                    <Name>GenerateAccessToken</Name>
                </Step>
            </Request>
            <Response/>
            <Condition>(proxy.pathsuffix MatchesPath "/token") and (request.verb = "POST")</Condition>
        </Flow>
...

Política de muestra

Esta es una política básica de GenerateAccessToken que se configura para aceptar el tipo de otorgamiento authorization_code. Para obtener información sobre los elementos de configuración opcionales que puedes configurar con esta política, consulta Política de OAuthV2.

<OAuthV2 name="GenerateAccessToken">
    <Operation>GenerateAccessToken</Operation>
    <ExpiresIn>1800000</ExpiresIn>
    <RefreshTokenExpiresIn>86400000</RefreshTokenExpiresIn>
    <SupportedGrantTypes>
      <GrantType>authorization_code</GrantType>
    </SupportedGrantTypes>
    <GenerateResponse enabled="true"/>
</OAuthV2>

Qué muestra

Con <GenerateResponse> habilitado, la política muestra una respuesta JSON que incluye el token de acceso, como se muestra a continuación. El tipo de concesión authorization_code crea un token de acceso y tokens de actualización, por lo que una respuesta podría verse de la siguiente manera:

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

Si <GenerateResponse> se establece como falso, la política no muestra una respuesta. En su lugar, se propaga el siguiente conjunto de variables de flujo con datos relacionados con la concesión de token de acceso.

oauthv2accesstoken.{policy-name}.access_token
oauthv2accesstoken.{policy-name}.expires_in //--in seconds
oauthv2accesstoken.{policy-name}.refresh_token
oauthv2accesstoken.{policy-name}.refresh_token_expires_in //--in seconds
oauthv2accesstoken.{policy-name}.refresh_token_issued_at
oauthv2accesstoken.{policy-name}.refresh_token_status

Por ejemplo:

oauthv2accesstoken.GenerateAccessToken.access_token
oauthv2accesstoken.GenerateAccessToken.expires_in
oauthv2accesstoken.GenerateAccessToken.refresh_token
oauthv2accesstoken.GenerateAccessToken.refresh_token_expires_in
oauthv2accesstoken.GenerateAccessToken.refresh_token_issued_at
oauthv2accesstoken.GenerateAccessToken.refresh_token_status

Solicitud de un token de acceso: tipo de otorgamiento de credenciales de cliente

En esta sección, se explica cómo solicitar un token de acceso mediante el flujo de tipo de otorgamiento de credenciales de cliente. Para obtener una introducción a los tipos de otorgamiento de OAuth 2.0, consulta Introducción a OAuth 2.0.

Solicitud de muestra

Para obtener información sobre cómo codificar el encabezado de autenticación básica en la siguiente llamada, consulta "Codifica las credenciales de autenticación básica".

$ curl -i -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'Authorization: Basic c3FIOG9vSGV4VHoAyg5T1JvNnJoZ3ExaVNyQWw6WjRsanRKZG5lQk9qUE1BVQ' \
  -X POST 'https://docs-test.apigee.net/oauth/accesstoken' \
  -d 'grant_type=client_credentials'

Parámetros obligatorios

De forma predeterminada, el parámetro allow_type requerido debe ser x-www-form-urlencoded y debe especificarse en el cuerpo de la solicitud (como se muestra en el ejemplo anterior). Sin embargo, es posible cambiar este valor predeterminado configurando el elemento <GrantType> en la política OAuthV2 adjunta a este extremo /accesstoken. Por ejemplo, puedes optar por pasar el parámetro en un parámetro de búsqueda. Para obtener más detalles, consulta la Política de OAuthV2.

  • grant_type: debe configurarse con el valor client_credentials.

Parámetros opcionales

  • state: es una string que se enviará con la respuesta. Por lo general, se usa para evitar ataques de falsificación de solicitudes entre sitios.
  • scope: permite filtrar la lista de productos de API con los que se puede usar el token acuñado. Para obtener información detallada sobre el alcance, consulta Trabaja con alcances de OAuth2.

Autenticación

Debes pasar el ID de cliente y el secreto del cliente como un encabezado de autenticación básica (codificado en Base64) o como los parámetros de formulario client_id y client_secret. Obtén estos valores de la app de desarrollador registrada asociada a la solicitud. Consulta también "Codificación de credenciales de autenticación básicas".

Extremo de muestra

A continuación, se muestra una configuración de extremo de muestra para generar un token de acceso. Ejecutará la política GenerateAccessToken, que debe configurarse para admitir el tipo de otorgamiento client_credentials.

...
       <Flow name="generate-access-token">
            <Request>
                <Step>
                    <Name>GenerateAccessToken</Name>
                </Step>
            </Request>
            <Response/>
            <Condition>(proxy.pathsuffix MatchesPath "/token") and (request.verb = "POST")</Condition>
        </Flow>
...

Política de muestra

Esta es una política básica de GenerateAccessToken que se configura para aceptar el tipo de otorgamiento client_credentials. Para obtener información sobre los elementos de configuración opcionales que puedes configurar con esta política, consulta Política de OAuthV2.

<OAuthV2 name="GenerateAccessToken">
    <Operation>GenerateAccessToken</Operation>
    <ExpiresIn>1800000</ExpiresIn> <!-- 30 minutes -->
    <SupportedGrantTypes>
      <GrantType>client_credentials</GrantType>
    </SupportedGrantTypes>
    <GenerateResponse enabled="true"/>
</OAuthV2>

Qué muestra

Cuando se habilita <GenerateResponse>, la política muestra una respuesta JSON. Ten en cuenta que con el tipo de otorgamiento client_credentials, no se admiten tokens de actualización. Solo se crea un token de acceso. Por ejemplo:

{
    "issued_at": "1420260525643",
    "application_name": "ce1e94a2-9c3e-42fa-a2c6-1ee01815476b",
    "scope": "READ",
    "status": "approved",
    "api_product_list": "[PremiumWeatherAPI]",
    "expires_in": "1799", //--in seconds
    "developer.email": "tesla@weathersample.com",
    "organization_id": "0",
    "token_type": "BearerToken",
    "client_id": "5jUAdGv9pBouF0wOH5keAVI35GBtx3dT",
    "access_token": "XkhU2DFnMGIVL2hvsRHLM00hRWav",
    "organization_name": "docs"
}

Si <GenerateResponse> se establece como falso, la política no muestra una respuesta. En su lugar, se propaga el siguiente conjunto de variables de flujo con datos relacionados con la concesión de token de acceso.

oauthv2accesstoken.{policy-name}.access_token
oauthv2accesstoken.{policy-name}.expires_in //--in seconds

Por ejemplo:

oauthv2accesstoken.GenerateAccessToken.access_token
oauthv2accesstoken.GenerateAccessToken.expires_in     //--in seconds

Cómo solicitar un token de acceso: tipo de otorgamiento de contraseña

En esta sección, se explica cómo solicitar un token de acceso mediante el flujo de tipo de otorgamiento de credenciales de contraseña (contraseña) del propietario del recurso. Para obtener una introducción a los tipos de otorgamiento de OAuth 2.0, consulta Introducción a OAuth 2.0.

Para obtener más detalles sobre el tipo de otorgamiento de contraseña, incluido un video de 4 minutos que muestra cómo implementarlo, consulta Cómo implementar el tipo de otorgamiento de contraseña.

Solicitud de muestra

Para obtener información sobre cómo codificar el encabezado de autenticación básica en la siguiente llamada, consulta "Codifica las credenciales de autenticación básica".

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

Parámetros obligatorios

De forma predeterminada, estos parámetros deben ser x-www-form-urlencoded y especificarse en el cuerpo de la solicitud (como se muestra en el ejemplo anterior). Sin embargo, es posible cambiar este valor predeterminado configurando los elementos <GrantType>, <Username> y <Password> en la política OAuthV2 vinculada a este extremo /token. Para obtener más información, consulta la política de OAuthV2.

Por lo general, las credenciales de usuario se validan en un almacén de credenciales mediante una política LDAP o JavaScript.

  • grant_type: debe configurarse con el valor password.
  • username: es el nombre de usuario del propietario del recurso.
  • password: es la contraseña del propietario del recurso.

Parámetros opcionales

  • state: es una string que se enviará con la respuesta. Por lo general, se usa para evitar ataques de falsificación de solicitudes entre sitios.
  • scope: permite filtrar la lista de productos de API con los que se puede usar el token acuñado. Para obtener información detallada sobre el alcance, consulta Trabaja con alcances de OAuth2.

Autenticación

Debes pasar el ID de cliente y el secreto del cliente como un encabezado de autenticación básica (codificado en Base64) o como los parámetros de formulario client_id y client_secret. Obtén estos valores de la app de desarrollador registrada asociada a la solicitud. Consulta también "Codificación de credenciales de autenticación básicas".

Extremo de muestra

A continuación, se muestra una configuración de extremo de muestra para generar un token de acceso. Ejecutará la política GenerateAccessToken, que debe configurarse para admitir el tipo de otorgamiento de contraseña.

...
       <Flow name="generate-access-token">
            <Request>
                <Step>
                    <Name>GenerateAccessToken</Name>
                </Step>
            </Request>
            <Response/>
            <Condition>(proxy.pathsuffix MatchesPath "/token") and (request.verb = "POST")</Condition>
        </Flow>
...

Política de muestra

Esta es una política básica de GenerateAccessToken que está configurada para aceptar el tipo de otorgamiento de contraseña. Para obtener información sobre los elementos de configuración opcionales que puedes configurar con esta política, consulta Política de OAuthV2.

<OAuthV2 name="GenerateAccessToken">
    <Operation>GenerateAccessToken</Operation>
    <ExpiresIn>1800000</ExpiresIn> <!-- 30 minutes -->
    <RefreshTokenExpiresIn>28800000</RefreshTokenExpiresIn> <!-- 8 hours -->
    <SupportedGrantTypes>
      <GrantType>password</GrantType>
    </SupportedGrantTypes>
    <GenerateResponse enabled="true"/>
</OAuthV2>

Qué muestra

Cuando se habilita <GenerateResponse>, la política muestra una respuesta JSON. Ten en cuenta que, con el tipo de otorgamiento de contraseña, se acuña un token de acceso y un token de actualización. Por ejemplo:

{
    "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", //--in seconds
    "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": "28799", //--in seconds
    "refresh_count": "0"
}

Si <GenerateResponse> se establece como falso, la política no muestra una respuesta. En su lugar, se propaga el siguiente conjunto de variables de flujo con datos relacionados con la concesión de token de acceso.

oauthv2accesstoken.{policy-name}.access_token
oauthv2accesstoken.{policy-name}.expires_in   //--in seconds
oauthv2accesstoken.{policy-name}.refresh_token
oauthv2accesstoken.{policy-name}.refresh_token_expires_in  //--in seconds
oauthv2accesstoken.{policy-name}.refresh_token_issued_at
oauthv2accesstoken.{policy-name}.refresh_token_status

Por ejemplo:

oauthv2accesstoken.GenerateAccessToken.access_token
oauthv2accesstoken.GenerateAccessToken.expires_in
oauthv2accesstoken.GenerateAccessToken.refresh_token
oauthv2accesstoken.GenerateAccessToken.refresh_token_expires_in
oauthv2accesstoken.GenerateAccessToken.refresh_token_issued_at
oauthv2accesstoken.GenerateAccessToken.refresh_token_status

Solicitud de un token de acceso: tipo de otorgamiento implícito

En esta sección, se explica cómo solicitar un token de acceso usando el flujo de tipo de concesión implícito. Para obtener una introducción a los tipos de otorgamiento de OAuth 2.0, consulta Introducción a OAuth 2.0.

Solicitud de muestra

$ curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
  'https://docs-test.apigee.net/oauth/implicit?response_type=token&client_id=ABC123&redirect_uri=http://callback-example.com'

Parámetros obligatorios

De forma predeterminada, estos parámetros deben ser parámetros de búsqueda (como se muestra en el ejemplo anterior). Sin embargo, es posible cambiar este valor predeterminado configurando los elementos <ResponseType>, <ClientId> y <RedirectUri> en la política de OAuthV2 que se adjunta a este /token. Para obtener más detalles, consulta la Política de OAuthV2.

Por lo general, las credenciales de usuario se validan en un almacén de credenciales mediante una política de texto destacado o de JavaScript de un servicio de LDAP.

  • response_type: se debe configurar con el valor token.
  • client_id: es el ID de cliente de una app para desarrolladores registrada.
  • redirect_uri: este parámetro es obligatorio si no se proporcionó un URI de devolución de llamada cuando se registró la app para desarrolladores del cliente. Si se proporcionó una URL de devolución de llamada en el registro del cliente, se comparará con este valor y debe coincidir exactamente.

Parámetros opcionales

  • state: es una string que se enviará con la respuesta. Por lo general, se usa para evitar ataques de falsificación de solicitudes entre sitios.
  • scope: permite filtrar la lista de productos de API con los que se puede usar el token acuñado. Para obtener información detallada sobre el alcance, consulta Trabaja con alcances de OAuth2.

Autenticación

El otorgamiento implícito no requiere autenticación básica. Debes pasar un ID de cliente como parámetro de solicitud, como se explica aquí.

Extremo de muestra

A continuación, se muestra una configuración de extremo de muestra para generar un token de acceso. Ejecutará la política GenerateAccessTokenImplicitGrant.

...
       <Flow name="generate-access-token-implicit">
            <Request>
                <Step>
                    <Name>GenerateAccessTokenImplicitGrant</Name>
                </Step>
            </Request>
            <Response/>
            <Condition>(proxy.pathsuffix MatchesPath "/implicit") and (request.verb = "POST")</Condition>
        </Flow>
...

Política de muestra

Esta es una política básica de GenerateAccessTokenImplicitGrant que procesa solicitudes de token para el flujo de tipo de otorgamiento implícito. Para obtener información sobre los elementos de configuración opcionales que puedes configurar con esta política, consulta Política de OAuthV2.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<OAuthV2 name="GenerateAccessTokenImplicit">
    <DisplayName>GenerateAccessTokenImplicit</DisplayName>
    <Operation>GenerateAccessTokenImplicitGrant</Operation>
    <GenerateResponse enabled="true"/>
</OAuthV2>

Qué muestra

Cuando se habilita <GenerateResponse>, la política muestra un redireccionamiento de ubicación 302 en el encabezado de respuesta. El redireccionamiento apunta a la URL especificada en el parámetro redirect_uri y se agrega con el token de acceso y la hora de vencimiento del token. Ten en cuenta que el tipo de otorgamiento implícito no es compatible con tokens de actualización. Por ejemplo:

https://callback-example.com#expires_in=1799&access_token=In4dKm4ueoGZRbIYJhC9yZCmTFw5

Si <GenerateResponse> se establece como falso, la política no muestra una respuesta. En su lugar, se propaga el siguiente conjunto de variables de flujo con datos relacionados con la concesión de token de acceso.

oauthv2accesstoken.{policy-name}.access_token
oauthv2accesstoken.{policy-name}.expires_in  //--in seconds

Por ejemplo:

oauthv2accesstoken.GenerateAccessToken.access_token
oauthv2accesstoken.GenerateAccessToken.expires_in   //--in seconds

Solicita un código de autorización

Si estás utilizando el flujo de tipo de otorgamiento de código de autorización, debes obtener un código de autorización antes de poder solicitar un token de acceso.

Solicitud de muestra

$ curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
  'http://myorg-test.apigee.net/oauth/authorize?client_id={consumer_key}&response_type=code'

En el ejemplo anterior, se adjunta una política de GenerateAuthorizationCode de OAuthV2 en el extremo del proxy /oauth/authorize (consulta el extremo de ejemplo a continuación).

Parámetros obligatorios

De forma predeterminada, estos parámetros deben ser parámetros de búsqueda (como se muestra en el ejemplo anterior). Sin embargo, es posible cambiar este valor predeterminado configurando los elementos <ResponseType>, <ClientId> y <RedirectUri> en la política de OAuthV2 que se adjunta a este /authorize. Para obtener más detalles, consulta la Política de OAuthV2.

  • response_type: se debe configurar con el valor code.
  • client_id: es el ID de cliente de una app para desarrolladores registrada.

Parámetros opcionales

  • redirect_uri: si se especifica un URI de devolución de llamada completo (no parcial) en la app cliente registrada, este parámetro es opcional; de lo contrario, es obligatorio. La devolución de llamada es la URL en la que Edge envía el código de autenticación recién creado. Consulta también Registra apps y administra claves de API.
  • state: es una string que se enviará con la respuesta. Por lo general, se usa para evitar ataques de falsificación de solicitudes entre sitios.
  • scope: permite filtrar la lista de productos de API con los que se puede usar el token acuñado. Para obtener información detallada sobre el alcance, consulta Trabaja con alcances de OAuth2.

Authentication

No requiere autenticación básica. Sin embargo, se debe proporcionar el ID de cliente de la app cliente registrada en la solicitud.

Extremo de muestra

Esta es una configuración de extremo de muestra para generar un código de autorización:


<OAuthV2 name="GenerateAuthorizationCode">
  <Operation>GenerateAuthorizationCode</Operation>
    <!--
    ExpiresIn, in milliseconds. The ref is optional. The explicitly specified
    value is the default, when the variable reference cannot be resolved.
        60000 = 1 minute
       120000 = 2 minutes
    -->
  <ExpiresIn>60000</ExpiresIn>
  <GenerateResponse enabled="true"/>
</OAuthV2>

Política de muestra

Esta es una política básica de GenerateAuthorizationCode. Para obtener información sobre los elementos opcionales de configuración que puedes configurar con esta política, consulta la política de OAuthV2.

<OAuthV2 name="GenerateAuthorizationCode">
    <Operation>GenerateAuthorizationCode</Operation>
    <GenerateResponse enabled="true"/>
</OAuthV2>

Qué muestra

Cuando se habilita <GenerateResponse>, la política muestra el parámetro de búsqueda ?code a la ubicación redirect_uri (URI de devolución de llamada) con el código de autorización adjunto. Se envía a través de un redireccionamiento del navegador 302 con la URL en el encabezado Ubicación de la respuesta. Por ejemplo: ?code=123456.

Si <GenerateResponse> se establece como false, la política no muestra una respuesta. En su lugar, se propaga el siguiente conjunto de variables de flujo con datos relacionados con el código de autorización.

oauthv2authcode.{policy-name}.code
oauthv2authcode.{policy-name}.scope
oauthv2authcode.{policy-name}.redirect_uri
oauthv2authcode.{policy-name}.client_id

Por ejemplo:

oauthv2authcode.GenerateAuthorizationCode.code
oauthv2authcode.GenerateAuthorizationCode.scope
oauthv2authcode.GenerateAuthorizationCode.redirect_uri
oauthv2authcode.GenerateAuthorizationCode.client_id

Actualización de un token de acceso

Un token de actualización es una credencial que usas para obtener un token de acceso, generalmente después de que el token de acceso caduca o se vuelve no válido. Se muestra un token de actualización en la respuesta cuando recibes un token de acceso.

Para solicitar un token de acceso nuevo con un token de actualización, haz lo siguiente:

Solicitud de muestra

Para obtener información sobre cómo codificar el encabezado de autenticación básica en la siguiente llamada, consulta "Codifica las credenciales de autenticación básica".

$ curl -X POST \
  -H "Content-type: application/x-www-form-urlencoded" \
  -H 'Authorization: Basic c3FIOG9vSGV4VHo4QzAyg5T1JvNnJoZ3ExaVNyQWw6WjRsanRKZG5lQk9qUE1BVQ' \
  https://myorg-test.apigee.net/my_oauth_endpoint/refresh_accesstoken \
  -d 'grant_type=refresh_token&refresh_token=my-refresh-token'

Parámetros obligatorios

  • grant_type: debe configurarse con el valor refresh_token.
  • refresh_token: es el token de actualización asociado con el token de acceso que deseas renovar.

De forma predeterminada, la política busca estos parámetros como parámetros x-www-form-urlencoded especificados en el cuerpo de la solicitud, como se muestra en el ejemplo anterior. A fin de configurar una ubicación alternativa para estas entradas, puedes usar los elementos <GrantType> y <RefreshToken> en la política de OAuthV2. Para obtener más detalles, consulta la Política de OAuthV2.

Parámetros opcionales

  • state: es una string que se enviará con la respuesta. Por lo general, se usa para evitar ataques de falsificación de solicitudes entre sitios.
  • scope: permite filtrar la lista de productos de API con los que se puede usar el token acuñado. Para obtener información detallada sobre el alcance, consulta Trabaja con alcances de OAuth2.

Authentication

  • client_id
  • client_secret

Debes pasar el ID de cliente y el secreto de cliente como un encabezado de autenticación básica (codificado en Base64) o como los parámetros de formulario client_id y client_secret. Consulta también "Codifica las credenciales de autenticación básicas".

Cuando se actualiza un token de acceso, no se vuelve a autenticar el usuario.

A continuación, se muestra una configuración de extremo de muestra para generar un token de acceso con un token de actualización. Ejecuta la política RefreshAccessToken.

 ...
       <Flow name="generate-refresh-token">
            <Request>
                <Step>
                    <Name>RefreshAccessToken</Name>
                </Step>
            </Request>
            <Response/>
            <Condition>(proxy.pathsuffix MatchesPath "/refresh") and (request.verb = "POST")</Condition>
       </Flow>
...

Política de muestra

Esta es una política básica de RefreshAccessToken que se configura para aceptar el tipo de otorgamiento refresh_token. Para obtener información sobre los elementos de configuración opcionales que puedes configurar con esta política, consulta Política de OAuthV2.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<OAuthV2 name="RefreshAccessToken">
    <Operation>RefreshAccessToken</Operation>
    <GenerateResponse enabled="true"/>
    <ExpiresIn>1800000</ExpiresIn> <!-- 30 minutes -->
    <RefreshTokenExpiresIn>28800000</RefreshTokenExpiresIn> <!-- 8 hours -->
</OAuthV2>

Qué muestra

Cuando se habilita <GenerateResponse>, la política muestra una respuesta JSON que contiene el token de acceso nuevo. El tipo de otorgamiento refresh_token admite la extracción de acceso y tokens de actualización nuevos. Por ejemplo:

{
    "issued_at": "1420301470489",
    "application_name": "ce1e94a2-9c3e-42fa-a2c6-1ee01815476b",
    "scope": "READ",
    "refresh_token_issued_at": "1420301470489",
    "status": "approved",
    "refresh_token_status": "approved",
    "api_product_list": "[PremiumWeatherAPI]",
    "expires_in": "1799", //--in seconds
    "developer.email": "tesla@weathersample.com",
    "token_type": "BearerToken",
    "refresh_token": "8fKDHLryAD9KFBsrpixlq3qPJnG2fdZ5",
    "client_id": "5jUAdGv9pBouF0wOH5keAVI35GBtx3dT",
    "access_token": "jmZ2Hqv3iNsABUtAAsfWR3QGNctw",
    "organization_name": "docs",
    "refresh_token_expires_in": "28799", //--in seconds
    "refresh_count": "2"
}

Debes saber que, después de extraer un token de actualización nuevo, el original ya no es válido.

La respuesta anterior es lo que obtienes si <GenerateResponse> se establece como true. Si <GenerateResponse> se establece como falso, la política no muestra una respuesta. En su lugar, se propaga el siguiente conjunto de variables de flujo con datos relacionados con el otorgamiento del token de acceso.

oauthv2accesstoken.{policy-name}.access_token
oauthv2accesstoken.{policy-name}.expires_in   //--in seconds
oauthv2accesstoken.{policy-name}.refresh_token
oauthv2accesstoken.{policy-name}.refresh_token_expires_in  //--in seconds
oauthv2accesstoken.{policy-name}.refresh_token_issued_at
oauthv2accesstoken.{policy-name}.refresh_token_status

Por ejemplo:

oauthv2accesstoken.RefreshAccessToken.access_token
oauthv2accesstoken.RefreshAccessToken.expires_in
oauthv2accesstoken.RefreshAccessToken.refresh_token
oauthv2accesstoken.RefreshAccessToken.refresh_token_expires_in
oauthv2accesstoken.RefreshAccessToken.refresh_token_issued_at
oauthv2accesstoken.RefreshAccessToken.refresh_token_status

Codificación de credenciales de autenticación básica

Cuando realizas una llamada a la API para solicitar un token o un código de autenticación, es una práctica recomendada, y la especificación OAuth 2.0 recomienda pasar los valores client_id y client_secret como un encabezado de autenticación básica HTTP, como se describe en IETF RFC 2617. Para hacerlo, debes codificar los datos en Base64 como el resultado de la unión de los dos valores y dos puntos separados por dos puntos.

En seudocódigo:

result = Base64Encode(concat('ns4fQc14Zg4hKFCNaSzArVuwszX95X', ':', 'ZIjFyTsNgQNyxI'))

En este ejemplo, ns4fQc14Zg4hKFCNaSzArVuwszX95X es el ID del cliente y ZIjFyTsNgQNyxI es el secreto del cliente.

Sin importar el lenguaje de programación que uses a fin de calcular el valor codificado en Base64, para las credenciales de cliente dadas, el resultado codificado en base64 es: bnM0ZlFjMTRaZzRoS0ZDTmFTekFyVnV3c3pYOTVYOlpJakZ5VHNOZ1FOeXhJOg==

Luego, puedes realizar la solicitud del token de la siguiente manera:

$ curl -i -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'Authorization: Basic bnM0ZlFjMTRaZzRoS0ZDTmFTekFyVnV3c3pYOTVYOlpJakZ5VHNOZ1FOeXhJOg==' \
  -X POST 'https://docs-test.apigee.net/oauth/accesstoken' \
  -d 'grant_type=client_credentials'

La utilidad curl creará el encabezado HTTP básico por ti si usas la opción -u. Lo siguiente es equivalente a lo anterior:

$ curl -i -H 'Content-Type: application/x-www-form-urlencoded' \
  -u 'ns4fQc14Zg4hKFCNaSzArVuwszX95X:ZIjFyTsNgQNyxI' \
  -X POST 'https://docs-test.apigee.net/oauth/accesstoken' \
  -d 'grant_type=client_credentials'

Otros entornos de programación pueden tener accesos directos similares que generan automáticamente el encabezado codificado en base64.

Hash de tokens en la base de datos

Para proteger el acceso a OAuth y los tokens de actualización en caso de una violación de la seguridad de la base de datos, puedes habilitar el hash automático de tokens en tu organización de Edge. Cuando la función está habilitada, Edge crea automáticamente una versión con hash del acceso OAuth recién generado y los tokens de actualización con el algoritmo que especifiques. (Se sigue la información sobre la codificación hash en tokens existentes). Los tokens sin hash se usan en las llamadas a la API, y Edge los valida con las versiones con hash de la base de datos.

Las siguientes propiedades a nivel de la organización controlan el hash de token de OAuth.

features.isOAuthTokenHashingEnabled = true
features.OAuthTokenHashingAlgorithm = SHA1 | SHA256 | SHA384 | SHA512 | PLAIN

Si tienes tokens con hash existentes y deseas conservarlos hasta que venzan, configura las siguientes propiedades en tu organización, en las que el algoritmo de hash coincide con el existente (por ejemplo, SHA1, la configuración predeterminada anterior de Edge). Si no se agregó un hash a los tokens, usa PLAIN.

features.isOAuthTokenFallbackHashingEnabled = true
features.OAuthTokenFallbackHashingAlgorithm = SHA1 | SHA256 | SHA384 | SHA512 | PLAIN

Si eres cliente de la nube de Edge, comunícate con la Asistencia de Apigee Edge para configurar estas propiedades en tu organización y, de forma opcional, si quieres generar un hash masivo de los tokens existentes.

Temas relacionados