

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Déclencheur Lambda de fédération entrante
<a name="user-pool-lambda-inbound-federation"></a>

Le déclencheur de fédération entrante transforme les attributs des utilisateurs fédérés pendant le processus d'authentification avec les fournisseurs d'identité externes. Lorsque les utilisateurs s'authentifient via des fournisseurs d'identité configurés, ce déclencheur vous permet de modifier les réponses des fournisseurs SAML et OIDC externes en interceptant et en transformant les données au cours du processus d'authentification, offrant ainsi un contrôle programmatique sur la manière dont les groupes d'utilisateurs Amazon Cognito gèrent les utilisateurs fédérés et leurs attributs.

Utilisez ce déclencheur pour ajouter, remplacer ou supprimer des attributs avant de créer de nouveaux utilisateurs ou de mettre à jour des profils d'utilisateurs fédérés existants. Ce déclencheur reçoit les attributs bruts du fournisseur d'identité en entrée et renvoie les attributs modifiés qu'Amazon Cognito applique au profil utilisateur.

**Topics**
+ [Vue d'ensemble du flux](#cognito-user-pools-lambda-trigger-inbound-federation-flow)
+ [Paramètres du déclencheur Lambda de la fédération entrante](#cognito-user-pools-lambda-trigger-syntax-inbound-federation)
+ [Exemple de fédération entrante : gestion des membres de groupes](#aws-lambda-triggers-inbound-federation-example-groups)
+ [Exemple de fédération entrante : tronquer de grands attributs](#aws-lambda-triggers-inbound-federation-example-truncate)
+ [Exemple de fédération entrante : enregistrement des événements de fédération](#aws-lambda-triggers-inbound-federation-example-logging)

## Vue d'ensemble du flux
<a name="cognito-user-pools-lambda-trigger-inbound-federation-flow"></a>

Lorsqu'un utilisateur s'authentifie auprès d'un fournisseur d'identité externe, Amazon Cognito invoque le déclencheur de fédération entrante avant de créer ou de mettre à jour le profil utilisateur. Le déclencheur reçoit les attributs bruts du fournisseur d'identité et peut les transformer avant qu'Amazon Cognito ne les stocke. Ce flux s'applique à la fois aux nouveaux utilisateurs fédérés et aux utilisateurs existants qui se reconnectent par le biais de la fédération.

![\[Flux de déclencheurs Lambda pour la fédération entrante\]](http://docs.aws.amazon.com/fr_fr/cognito/latest/developerguide/images/lambda-inbound-federation.png)


## Paramètres du déclencheur Lambda de la fédération entrante
<a name="cognito-user-pools-lambda-trigger-syntax-inbound-federation"></a>

La demande qu’Amazon Cognito transmet à cette fonction Lambda est une combinaison des paramètres ci-dessous et des [paramètres courants](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html#cognito-user-pools-lambda-trigger-syntax-shared) qu’Amazon Cognito ajoute à toutes les demandes.

------
#### [ 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"
        }
    }
}
```

------

### Paramètres des demandes de fédération entrantes
<a name="cognito-user-pools-lambda-trigger-syntax-inbound-federation-request"></a>

**Nom du fournisseur**  
Le nom du fournisseur d'identité externe.

**Type de fournisseur**  
Type du fournisseur d'identité externe. Valeurs valides :`OIDC`,`SAML`,`Facebook`,`Google`,`SignInWithApple`,`LoginWithAmazon`.

**attributs**  
Les attributs bruts reçus du fournisseur d'identité avant le traitement. La structure varie en fonction du type de fournisseur.

**Attributs.tokenResponse**  
OAuth données de réponse du jeton provenant du `/token` point de terminaison. Disponible uniquement pour l'OIDC et les prestataires sociaux. Contient`access_token`,`id_token`, `refresh_token``token_type`,`expires_in`, et`scope`.

**Attributs.IDToken**  
JWT revendique un jeton d'identification décodé et validé. Disponible uniquement pour l'OIDC et les prestataires sociaux. Contient des informations d'identité utilisateur vérifiées, notamment `sub` (identifiant utilisateur unique) `email``name`,,, `iss` (émetteur), `aud` (public), `exp` (expiration) et `iat` (heure d'émission).

**Attributs.UserInfo**  
Informations de profil utilisateur étendues depuis le UserInfo point de terminaison. Disponible uniquement pour l'OIDC et les prestataires sociaux. Contient des attributs de profil détaillés tels que`given_name`,,`family_name`, `picture``address`, et d'autres champs spécifiques au fournisseur. Peut être vide si l'IdP ne prend pas en charge le point de UserInfo terminaison ou si l'appel du point de terminaison échoue.

**Attributs.SAML Response**  
Attributs d'assertion SAML. Disponible uniquement pour les fournisseurs SAML. Contient les attributs de la réponse SAML.

### Paramètres de réponse de la fédération entrante
<a name="cognito-user-pools-lambda-trigger-syntax-inbound-federation-response"></a>

**userAttributesToCarte**  
Les attributs utilisateur à appliquer au profil utilisateur.

**Important**  
Vous devez inclure TOUS les attributs utilisateur que vous souhaitez conserver dans la réponse, y compris les attributs que vous ne modifiez pas. Tous les attributs non inclus dans la `userAttributesToMap` réponse seront supprimés et ne seront pas stockés dans le profil utilisateur. Cela s'applique à la fois aux attributs modifiés et non modifiés.

**Comportement de réponse vide**  
Si vous renvoyez un objet vide `{}` pour`userAttributesToMap`, tous les attributs d'origine du fournisseur d'identité restent inchangés. Cela agit comme un no-op, comme si la fonction Lambda n'avait jamais été exécutée. Cela est différent de l'omission d'attributs, qui les supprime.

**Attributs spécifiques au fournisseur**  
La structure de `request.attributes` varie en fonction du`providerType`. L'OIDC et les fournisseurs sociaux incluent `tokenResponse``idToken`, et les `userInfo` objets. Les fournisseurs SAML incluent uniquement l'`samlResponse`objet.

## Exemple de fédération entrante : gestion des membres de groupes
<a name="aws-lambda-triggers-inbound-federation-example-groups"></a>

Cet exemple montre comment mapper des groupes de fournisseurs d'identité fédérés à des groupes de groupes d'utilisateurs Amazon Cognito. Cette fonction extrait l'appartenance à un groupe à partir de la réponse fédérée et ajoute automatiquement les utilisateurs aux groupes Amazon Cognito correspondants, éliminant ainsi le besoin de déclencheurs post-authentification.

------
#### [ 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 transmet les informations d’événement à votre fonction Lambda. Cette fonction renvoie alors le même objet d’événement à Amazon Cognito, avec d’éventuelles modifications dans la réponse. Dans la console Lambda, vous pouvez configurer un événement de test avec des données pertinentes pour votre déclencheur Lambda. Voici un événement de test pour cet exemple de code :

------
#### [ 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": {}
    }
}
```

------

## Exemple de fédération entrante : tronquer de grands attributs
<a name="aws-lambda-triggers-inbound-federation-example-truncate"></a>

Cet exemple montre comment tronquer les valeurs d'attribut qui dépassent les limites de stockage d'Amazon Cognito. Cette fonction vérifie chaque attribut du fournisseur d'identité. Si la valeur d'un attribut dépasse 2 048 caractères, elle est tronquée et des points de suspension sont ajoutés pour indiquer la troncature. Tous les autres attributs sont transmis sans modification.

------
#### [ 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 transmet les informations d’événement à votre fonction Lambda. Cette fonction renvoie alors le même objet d’événement à Amazon Cognito, avec d’éventuelles modifications dans la réponse. Dans la console Lambda, vous pouvez configurer un événement de test avec des données pertinentes pour votre déclencheur Lambda. Voici un événement de test pour cet exemple de code :

------
#### [ 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": {}
    }
}
```

------

## Exemple de fédération entrante : enregistrement des événements de fédération
<a name="aws-lambda-triggers-inbound-federation-example-logging"></a>

Cet exemple montre comment enregistrer les événements d'authentification fédérée à des fins de surveillance et de débogage. Cet exemple de fonction capture des informations détaillées sur les utilisateurs fédérés et leurs attributs, offrant ainsi une visibilité sur le processus d'authentification.

------
#### [ 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 transmet les informations d’événement à votre fonction Lambda. Cette fonction renvoie alors le même objet d’événement à Amazon Cognito, avec d’éventuelles modifications dans la réponse. Dans la console Lambda, vous pouvez configurer un événement de test avec des données pertinentes pour votre déclencheur Lambda. Voici un événement de test pour cet exemple de code :

------
#### [ 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": {}
    }
}
```

------

Sortie CloudWatch des journaux attendue :

------
#### [ 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"
    }
}
```

------