

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Activador Lambda de federación entrante
<a name="user-pool-lambda-inbound-federation"></a>

El activador de federación entrante transforma los atributos de los usuarios federados durante el proceso de autenticación con proveedores de identidad externos. Cuando los usuarios se autentican a través de proveedores de identidad configurados, este desencadenante le permite modificar las respuestas de proveedores de SAML y OIDC externos al interceptar y transformar los datos en el proceso de autenticación, lo que proporciona un control programático sobre la forma en que los grupos de usuarios de Amazon Cognito gestionan los usuarios federados y sus atributos.

Utilice este activador para añadir, anular o suprimir atributos antes de crear nuevos usuarios o actualizar los perfiles de usuarios federados existentes. Este activador recibe los atributos sin procesar del proveedor de identidad como entrada y devuelve los atributos modificados que Amazon Cognito aplica al perfil de usuario.

**Topics**
+ [Información general sobre flujos](#cognito-user-pools-lambda-trigger-inbound-federation-flow)
+ [Parámetros de activación de Lambda de federación entrante](#cognito-user-pools-lambda-trigger-syntax-inbound-federation)
+ [Ejemplo de federación entrante: administración de miembros de grupos](#aws-lambda-triggers-inbound-federation-example-groups)
+ [Ejemplo de federación entrante: truncar atributos grandes](#aws-lambda-triggers-inbound-federation-example-truncate)
+ [Ejemplo de federación entrante: registro de eventos de federación](#aws-lambda-triggers-inbound-federation-example-logging)

## Información general sobre flujos
<a name="cognito-user-pools-lambda-trigger-inbound-federation-flow"></a>

Cuando un usuario se autentica con un proveedor de identidad externo, Amazon Cognito invoca el activador de federación entrante antes de crear o actualizar el perfil de usuario. El activador recibe los atributos sin procesar del proveedor de identidad y puede transformarlos antes de que Amazon Cognito los almacene. Este flujo se produce tanto para los nuevos usuarios federados como para los usuarios existentes que vuelven a iniciar sesión mediante la federación.

![\[Flujo de activación de Lambda de federación entrante\]](http://docs.aws.amazon.com/es_es/cognito/latest/developerguide/images/lambda-inbound-federation.png)


## Parámetros de activación de Lambda de federación entrante
<a name="cognito-user-pools-lambda-trigger-syntax-inbound-federation"></a>

La solicitud que Amazon Cognito envía a esta función de Lambda es una combinación de los parámetros que se indican a continuación y los [parámetros comunes](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html#cognito-user-pools-lambda-trigger-syntax-shared) que Amazon Cognito agrega a todas las solicitudes.

------
#### [ JSON ]

```
{
    "version": "string",
    "triggerSource": "InboundFederation_ExternalProvider",
    "region": AWSRegion,
    "userPoolId": "string",
    "userName": "string",
    "callerContext": {
        "awsSdkVersion": "string",
        "clientId": "string"
    },
    "request": {
        "providerName": "string",
        "providerType": "string",
        "attributes": {
            "tokenResponse": {
                "access_token": "string",
                "token_type": "string",
                "expires_in": "string"
            },
            "idToken": {
                "sub": "string",
                "email": "string",
                "email_verified": "string"
            },
            "userInfo": {
                "email": "string",
                "given_name": "string",
                "family_name": "string"
            },
            "samlResponse": {
                "string": "string"
            }
        }
    },
    "response": {
        "userAttributesToMap": {
            "string": "string"
        }
    }
}
```

------

### Parámetros de las solicitudes de federación entrantes
<a name="cognito-user-pools-lambda-trigger-syntax-inbound-federation-request"></a>

**Nombre del proveedor**  
El nombre del proveedor de identidad externo.

**Tipo de proveedor**  
El tipo de proveedor de identidad externo. Valores válidos: `OIDC``SAML`,`Facebook`,`Google`,`SignInWithApple`,`LoginWithAmazon`.

**attributes**  
Los atributos sin procesar recibidos del proveedor de identidad antes del procesamiento. La estructura varía según el tipo de proveedor.

**Atributos. TokenResponse**  
OAuth datos de respuesta simbólicos del punto final. `/token` Disponible solo para el OIDC y los proveedores sociales. Contiene`access_token`,`id_token`, `refresh_token` `token_type``expires_in`, y. `scope`

**Attributes.idToken**  
JWT afirma que el token de identificación decodificado y validado. Disponible solo para el OIDC y los proveedores sociales. Contiene información de identidad de usuario verificada, que incluye `sub` (identificador de usuario único) `email``name`,, `iss` (emisor), `aud` (audiencia), `exp` (caducidad) y `iat` (hora de emisión).

**Attributes.UserInfo**  
Información de perfil de usuario ampliada desde el punto final. UserInfo Disponible solo para el OIDC y los proveedores sociales. Contiene atributos de perfil detallados`given_name`, como, `family_name` `picture``address`, y otros campos específicos del proveedor. Puede estar vacío si el IdP no es compatible con el UserInfo punto final o si la llamada al punto final falla.

**Atributos. Respuesta SAML**  
Atributos de aserción de SAML. Disponible solo para proveedores de SAML. Contiene los atributos de la respuesta de SAML.

### Parámetros de respuesta de la federación entrante
<a name="cognito-user-pools-lambda-trigger-syntax-inbound-federation-response"></a>

**userAttributesToMapa**  
Los atributos de usuario que se van a aplicar al perfil de usuario.

**importante**  
Debe incluir TODOS los atributos de usuario que desee conservar en la respuesta, incluidos los atributos que no vaya a modificar. Los atributos que no estén incluidos en la `userAttributesToMap` respuesta se eliminarán y no se almacenarán en el perfil de usuario. Esto se aplica tanto a los atributos modificados como a los no modificados.

**Comportamiento de respuesta vacía**  
Si devuelves un objeto vacío `{}` para`userAttributesToMap`, todos los atributos originales del proveedor de identidad se conservan sin cambios. Esto actúa como una operación no operativa, como si la función Lambda nunca se hubiera ejecutado. Esto es diferente de omitir atributos, que los elimina.

**Atributos específicos del proveedor**  
La estructura de `request.attributes` varía según. `providerType` El OIDC y los proveedores sociales incluyen `tokenResponse``idToken`, y `userInfo` objetos. Los proveedores de SAML incluyen solo el objeto. `samlResponse`

## Ejemplo de federación entrante: administración de miembros de grupos
<a name="aws-lambda-triggers-inbound-federation-example-groups"></a>

En este ejemplo, se muestra cómo asignar grupos de proveedores de identidad federados a grupos de grupos de usuarios de Amazon Cognito. Esta función extrae la pertenencia a un grupo de la respuesta federada y añade automáticamente los usuarios a los grupos de Amazon Cognito correspondientes, lo que elimina la necesidad de activar activadores posteriores a la autenticación.

------
#### [ Node.js ]

```
exports.handler = async (event) => {
    const { providerType, attributes } = event.request;
    
    // Extract user attributes based on provider type
    let userAttributesFromIdp = {};
    if (providerType === 'SAML') {
        userAttributesFromIdp = attributes.samlResponse || {};
    } else {
        // For OIDC and Social providers, merge userInfo and idToken
        userAttributesFromIdp = {
            ...(attributes.userInfo || {}),
            ...(attributes.idToken || {})
        };
    }
    
    // Extract groups from federated response
    const federatedGroups = userAttributesFromIdp.groups?.split(',') || [];
    
    // Map federated groups to Cognito groups
    const groupMapping = {
        'Domain Admins': 'Administrators',
        'Engineering': 'Developers',
        'Sales': 'SalesTeam'
    };
    
    // Filter to only in-scope groups
    const mappedGroups = federatedGroups
        .map(group => groupMapping[group.trim()])
        .filter(group => group); // Remove undefined values
    
    // Pass through attributes with mapped groups as custom attribute
    const attributesToMap = {
        ...userAttributesFromIdp,
        'custom:user_groups': mappedGroups.join(',')
    };
    
    // Remove original groups attribute
    delete attributesToMap.groups;
    
    event.response.userAttributesToMap = attributesToMap;
    return event;
};
```

------

Amazon Cognito transfiere la información del evento a la función de Lambda. A continuación, la función devuelve el mismo objeto de evento a Amazon Cognito con los cambios en la respuesta. En la consola de Lambda puede configurar un evento de prueba con los datos relevantes para el desencadenador de Lambda. El siguiente es un evento de prueba para este código de ejemplo:

------
#### [ JSON ]

```
{
    "userPoolId": "us-east-1_XXXXXXXXX",
    "request": {
        "providerName": "CorporateAD",
        "providerType": "SAML",
        "attributes": {
            "samlResponse": {
                "email": "jane.smith@company.com",
                "given_name": "Jane",
                "family_name": "Smith",
                "groups": "Engineering,Domain Admins",
                "department": "Engineering"
            }
        }
    },
    "response": {
        "userAttributesToMap": {}
    }
}
```

------

## Ejemplo de federación entrante: truncar atributos grandes
<a name="aws-lambda-triggers-inbound-federation-example-truncate"></a>

En este ejemplo, se muestra cómo truncar los valores de los atributos que superan los límites de almacenamiento de Amazon Cognito. Esta función comprueba cada atributo del proveedor de identidad. Si el valor de un atributo supera los 2048 caracteres, trunca el valor y añade puntos suspensivos para indicar el truncamiento. Todos los demás atributos pasan sin cambios.

------
#### [ Node.js ]

```
exports.handler = async (event) => {
    const MAX_ATTRIBUTE_LENGTH = 2048;
    
    // Get the identity provider attributes based on provider type
    const { providerType, attributes } = event.request;
    let idpAttributes = {};
    
    if (providerType === 'SAML') {
        idpAttributes = attributes.samlResponse || {};
    } else {
        // For OIDC and Social providers, merge userInfo and idToken
        idpAttributes = {
            ...(attributes.userInfo || {}),
            ...(attributes.idToken || {})
        };
    }
    
    const userAttributes = {};
    
    // Process each attribute
    for (const [key, value] of Object.entries(idpAttributes)) {
        if (typeof value === 'string' && value.length > MAX_ATTRIBUTE_LENGTH) {
            // Truncate the value and add ellipsis
            userAttributes[key] = value.substring(0, MAX_ATTRIBUTE_LENGTH - 3) + '...';
            console.log(`Truncated attribute ${key} from ${value.length} to ${userAttributes[key].length} characters`);
        } else {
            // Keep the original value
            userAttributes[key] = value;
        }
    }
    
    // Return the modified attributes
    event.response.userAttributesToMap = userAttributes;
    return event;
};
```

------

Amazon Cognito transfiere la información del evento a la función de Lambda. A continuación, la función devuelve el mismo objeto de evento a Amazon Cognito con los cambios en la respuesta. En la consola de Lambda puede configurar un evento de prueba con los datos relevantes para el desencadenador de Lambda. El siguiente es un evento de prueba para este código de ejemplo:

------
#### [ JSON ]

```
{
    "version": "string",
    "triggerSource": "InboundFederation_ExternalProvider",
    "region": "us-east-1",
    "userPoolId": "us-east-1_XXXXXXXXX",
    "userName": "ExampleProvider_12345",
    "callerContext": {
        "awsSdkVersion": "string",
        "clientId": "string"
    },
    "request": {
        "providerName": "ExampleProvider",
        "providerType": "OIDC",
        "attributes": {
            "tokenResponse": {
                "access_token": "abcDE...",
                "token_type": "Bearer",
                "expires_in": "3600"
            },
            "idToken": {
                "sub": "12345",
                "email": "user@example.com"
            },
            "userInfo": {
                "email": "user@example.com",
                "given_name": "Example",
                "family_name": "User",
                "bio": "This is a very long biography that contains more than 2048 characters..."
            }
        }
    },
    "response": {
        "userAttributesToMap": {}
    }
}
```

------

## Ejemplo de federación entrante: registro de eventos de federación
<a name="aws-lambda-triggers-inbound-federation-example-logging"></a>

En este ejemplo se muestra cómo registrar los eventos de autenticación federada para su supervisión y depuración. Esta función de ejemplo captura información detallada sobre los usuarios federados y sus atributos, lo que proporciona visibilidad del proceso de autenticación.

------
#### [ Node.js ]

```
exports.handler = async (event) => {
    const { providerName, providerType, attributes } = event.request;
    
    // Extract user attributes based on provider type
    let userAttributesFromIdp = {};
    if (providerType === 'SAML') {
        userAttributesFromIdp = attributes.samlResponse || {};
    } else {
        // For OIDC and Social providers, merge userInfo and idToken
        userAttributesFromIdp = {
            ...(attributes.userInfo || {}),
            ...(attributes.idToken || {})
        };
    }
    
    // Log federated authentication details
    console.log(JSON.stringify({
        timestamp: new Date().toISOString(),
        providerName,
        providerType,
        userEmail: userAttributesFromIdp.email,
        attributeCount: Object.keys(userAttributesFromIdp).length,
        attributes: userAttributesFromIdp
    }));
    
    // Pass through all attributes unchanged
    event.response.userAttributesToMap = userAttributesFromIdp;
    return event;
};
```

------

Amazon Cognito transfiere la información del evento a la función de Lambda. A continuación, la función devuelve el mismo objeto de evento a Amazon Cognito con los cambios en la respuesta. En la consola de Lambda puede configurar un evento de prueba con los datos relevantes para el desencadenador de Lambda. El siguiente es un evento de prueba para este código de ejemplo:

------
#### [ JSON ]

```
{
    "version": "string",
    "triggerSource": "InboundFederation_ExternalProvider",
    "region": "us-east-1",
    "userPoolId": "us-east-1_XXXXXXXXX",
    "userName": "CorporateAD_john.doe",
    "callerContext": {
        "awsSdkVersion": "string",
        "clientId": "string"
    },
    "request": {
        "providerName": "CorporateAD",
        "providerType": "SAML",
        "attributes": {
            "samlResponse": {
                "email": "john.doe@company.com",
                "given_name": "John",
                "family_name": "Doe",
                "department": "Engineering",
                "employee_id": "EMP12345"
            }
        }
    },
    "response": {
        "userAttributesToMap": {}
    }
}
```

------

Resultado esperado CloudWatch de los registros:

------
#### [ JSON ]

```
{
    "timestamp": "2025-01-14T21:17:40.153Z",
    "providerName": "CorporateAD",
    "providerType": "SAML",
    "userEmail": "john.doe@company.com",
    "attributeCount": 5,
    "attributes": {
        "email": "john.doe@company.com",
        "given_name": "John",
        "family_name": "Doe",
        "department": "Engineering",
        "employee_id": "EMP12345"
    }
}
```

------