Habilita el acceso a los tokens de OAuth 2.0 por ID de usuario y de app

Edge para nube privada v. 4.17.05

En este documento, se describe cómo habilitar la recuperación y revocación de tokens de acceso de OAuth 2.0 con el ID de usuario final, el ID de app o ambos.

Los IDs de app se agregan automáticamente a un token de acceso de OAuth. Por lo tanto, después de usar el siguiente procedimiento para habilitar el acceso a tokens para una organización, puedes acceder a los tokens por ID de app.

Para recuperar y revocar tokens de acceso de OAuth 2.0 por ID de usuario final, debe haber un ID de usuario final en el token de acceso. En el siguiente procedimiento, se describe cómo agregar un ID de usuario final a un token existente o a tokens nuevos.

De forma predeterminada, cuando Edge genera un token de acceso de OAuth 2.0, el token tiene el siguiente formato:

{
  "issued_at" : "1421847736581",
  "application_name" : "a68d01f8-b15c-4be3-b800-ceae8c456f5a",
  "scope" : "READ",
  "status" : "approved",
  "api_product_list" : "[PremiumWeatherAPI]",
  "expires_in" : "3599",
  "developer.email" : "tesla@weathersample.com",
  "organization_id" : "0",
  "token_type" : "BearerToken",
  "client_id" : "k3nJyFJIA3p62DWOkLO6OJNi87GYXFmP",
  "access_token" : "7S22UqXGJDTuUADGzJzjXzXSaGJL",
  "organization_name" : "myorg",
  "refresh_token_expires_in" : "0",
  "refresh_count" : "0"
}

Ten en cuenta lo siguiente:

  • El campo application_name contiene el UUID de la app asociada con el token. Si habilitas la recuperación y la revocación de tokens de acceso de OAuth 2.0 por ID de app, este es el ID de app que usarás.
  • El campo access_token contiene el valor del token de acceso de OAuth 2.0.

Para habilitar la recuperación y revocación de tokens de acceso de OAuth 2.0 por ID de usuario final, configura la política OAuth 2.0 de modo que incluya el ID de usuario en el token, como se describe en el siguiente procedimiento.

El ID del usuario final es la cadena que Edge usa como ID de desarrollador, no la dirección de correo electrónico del desarrollador. Para determinar su ID a partir de la dirección de correo electrónico del desarrollador, usa la llamada a la API de Get Developer.

Después de configurar Edge para que incluya el ID de usuario final en el token, este se incluye como el campo app_enduser, como se muestra a continuación:

{
  "issued_at" : "1421847736581",
  "application_name" : "a68d01f8-b15c-4be3-b800-ceae8c456f5a",
  "scope" : "READ",
  "app_enduser" : "6ZG094fgnjNf02EK",
  "status" : "approved",
  "api_product_list" : "[PremiumWeatherAPI]",
  "expires_in" : "3599",
  "developer.email" : "tesla@weathersample.com",
  "organization_id" : "0",
  "token_type" : "BearerToken",
  "client_id" : "k3nJyFJIA3p62DWOkLO6OJNi87GYXFmP",
  "access_token" : "7S22UqXGJDTuUADGzJzjXzXSaGJL",
  "organization_name" : "myorg",
  "refresh_token_expires_in" : "0",
  "refresh_count" : "0"
}

APIs para recuperar y revocar tokens de acceso de OAuth 2.0 por ID de usuario y de app

Usa las siguientes APIs para acceder a los tokens de OAuth por ID de usuario, ID de app o ambos:

Procedimiento para habilitar el acceso a los tokens

Usa el siguiente procedimiento para habilitar la recuperación y revocación de tokens de acceso de OAuth 2.0 por ID de usuario final y de app.

Paso 1: Habilita la compatibilidad de acceso con tokens para una organización

Debes habilitar el acceso al token para cada organización por separado. Llama a la API de PUT que aparece a continuación para cada organización en la que quieras habilitar la recuperación y revocación de tokens de acceso de OAuth 2.0 por ID de usuario final o ID de app.

El usuario que realiza la siguiente llamada debe tener la función orgadmin o opsadmin en la organización. Reemplaza los valores de {curly llaves} por los valores específicos de tu organización:

> curl -H "Content-type:text/xml" -X POST \
  https://<ms-ip>:8080/v1/organizations/{org_name} \
  -d '<Organization name="{org_name}">
      <Properties>
        <Property name="features.isOAuthRevokeEnabled">true</Property>
        <Property name="features.isOAuth2TokenSearchEnabled">true</Property>
      </Properties>
    </Organization>' \ 
  -u {userEmail}:{mypassword}

Paso 2: Configura los permisos para el rol de opsadmin en la organización

Solo los roles orgadmin y opsadmin de una organización deben tener permisos para recuperar (HTTP GET) y revocar tokens de OAuth 2.0 (HTTP PUT) según el ID de usuario o el ID de app. Para controlar el acceso, configura los permisos get y put en el recurso /oauth2 de una organización. Ese recurso tiene una URL con el siguiente formato:

https://<ms-ip>:8080/v1/organizations/{org_name}/oauth2

El rol de administrador de la organización ya debería tener los permisos necesarios. En el caso de la función de opsadmin del recurso /oauth2, los permisos deberían verse así:

<ResourcePermission path="/oauth2">
    <Permissions>
        <Permission>get</Permission>
        <Permission>put</Permission>
    </Permissions>
</ResourcePermission>

Puedes usar la llamada Obtener permiso para una API de un único recurso para ver qué roles tienen permisos para el recurso /oauth2.

En función de la respuesta, puedes usar las llamadas a la API Cómo agregar permisos para un recurso en un rol y Borrar permiso para recursos a fin de realizar los ajustes necesarios en los permisos de recursos /oauth2.

Usa el siguiente comando cURL para otorgar a la función opsadmin los permisos get y put para el recurso /oauth2. Reemplaza los valores de {curly entre llaves} por los valores específicos de tu organización:

> curl -X POST -H 'Content-type:application/xml' \
  http://<ms-ip>:8080/v1/organizations/{org}/userroles/opsadmin/permissions \
  -d '<ResourcePermission path="/oauth2">
      <Permissions>
        <Permission>get</Permission>
        <Permission>put</Permission>
      </Permissions>
    </ResourcePermission>' \
  -u {USEREMAIL}:{PWD} 

Usa el siguiente comando de cURL para revocar los permisos get y put del recurso /oauth2 desde funciones que no sean orgadmin y opsadmin. Reemplaza los valores de {curly llaves} por los valores específicos de tu organización:

> curl -X DELETE -H 'Content-type:application/xml' \
  http://<msip>:8080/v1/organizations/{org-name}/userroles/{roles}/permissions \
  -d '<ResourcePermission path="/oauth2">
      <Permissions></Permissions>
    </ResourcePermission>' \
   -u {USEREMAIL}:{PWD} 

Paso 3: Configura la propiedad oauth_max_search_limit

Asegúrate de que la propiedad conf_keymanagement_oauth_max_search_limit en el archivo /opt/apigee/customer/application/management-server.properties esté configurada en 100:

conf_keymanagement_oauth_max_search_limit = 100

Si el archivo no existe, créalo.

Esta propiedad establece el tamaño de la página que se usa para recuperar tokens. Apigee recomienda un valor de 100, pero puedes establecerlo como estimes conveniente.

En una instalación nueva, la propiedad ya debería estar establecida en 100. Si tienes que cambiar el valor de esta propiedad, reinicia el servidor de administración y el procesador de mensajes con los siguientes comandos:

> /opt/apigee/apigee-service/bin/apigee-service edge-management-server restart
> /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart

Paso 4: Configura la política de OAuth 2.0 que genera tokens para incluir el ID de usuario final

Configura la política de OAuth 2.0 que se usa para generar tokens de acceso a fin de incluir el ID del usuario final en el token. Si incluyes los IDs de usuario final en el token de acceso, puedes recuperar y revocar tokens por ID.

Si quieres configurar la política para que incluya un ID de usuario final en un token de acceso, la solicitud que crea el token de acceso debe incluir el ID de usuario final y debes especificar la variable de entrada que contiene el ID de usuario final.

La siguiente política de OAuth 2.0, denominada GenerateAccessTokenClient, genera un token de acceso de OAuth 2.0. Observa la adición de la etiqueta <AppEndUser> en negrita que especifica la variable que contiene el ID de usuario final:

<OAuthV2 async="false" continueOnError="false" enabled="true" name="GenerateAccessTokenClient">
    <DisplayName>OAuth 2.0.0 1</DisplayName>
    <ExternalAuthorization>false</ExternalAuthorization>
    <Operation>GenerateAccessToken</Operation>
    <SupportedGrantTypes>
         <GrantType>client_credentials</GrantType>
    </SupportedGrantTypes>
    <GenerateResponse enabled="true"/>
    <GrantType>request.queryparam.grant_type</GrantType> 
    <AppEndUser>request.header.appuserID</AppEndUser> 
    <ExpiresIn>960000</ExpiresIn>
</OAuthV2>

Luego, puedes usar el siguiente comando cURL para generar el token de acceso de OAuth 2.0 y pasar el ID de usuario como el encabezado appuserID:

> curl -H "appuserID:6ZG094fgnjNf02EK" \
https://myorg-test.apigee.net/oauth/client_credential/accesstoken?grant_type=client_credentials \
  -X POST \
  -d 'client_id=k3nJyFJIA3p62TKIkLO6OJNXFmP&client_secret=gk5K5lIp943AY4'

En este ejemplo, el appuserID se pasa como un encabezado de solicitud. Puedes pasar información como parte de una solicitud de muchas maneras. Por ejemplo, como alternativa puedes hacer lo siguiente:

  • Usa una variable de parámetro de formulario: request.formparam.appuserID
  • Usa una variable de flujo que proporcione el ID de usuario final