

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Pemicu Lambda federasi masuk
<a name="user-pool-lambda-inbound-federation"></a>

Pemicu federasi masuk mengubah atribut pengguna federasi selama proses otentikasi dengan penyedia identitas eksternal. Saat pengguna mengautentikasi melalui penyedia identitas yang dikonfigurasi, pemicu ini memungkinkan Anda untuk memodifikasi respons dari penyedia SAFL dan OIDC eksternal dengan mencegat dan mengubah data dalam proses otentikasi, memberikan kontrol terprogram atas cara kumpulan pengguna Amazon Cognito menangani pengguna gabungan dan atributnya.

Gunakan pemicu ini untuk menambah, mengganti, atau menekan atribut sebelum membuat pengguna baru atau memperbarui profil pengguna federasi yang ada. Pemicu ini menerima atribut penyedia identitas mentah sebagai input dan mengembalikan atribut yang dimodifikasi yang diterapkan Amazon Cognito ke profil pengguna.

**Topics**
+ [Ikhtisar aliran](#cognito-user-pools-lambda-trigger-inbound-federation-flow)
+ [Parameter pemicu Lambda federasi masuk](#cognito-user-pools-lambda-trigger-syntax-inbound-federation)
+ [Contoh federasi masuk: Manajemen keanggotaan grup](#aws-lambda-triggers-inbound-federation-example-groups)
+ [Contoh federasi masuk: Memangkas atribut besar](#aws-lambda-triggers-inbound-federation-example-truncate)
+ [Contoh federasi masuk: Acara federasi logging](#aws-lambda-triggers-inbound-federation-example-logging)

## Ikhtisar aliran
<a name="cognito-user-pools-lambda-trigger-inbound-federation-flow"></a>

Saat pengguna mengautentikasi dengan penyedia identitas eksternal, Amazon Cognito memanggil pemicu federasi masuk sebelum membuat atau memperbarui profil pengguna. Pemicu menerima atribut mentah dari penyedia identitas dan dapat mengubahnya sebelum Amazon Cognito menyimpannya. Alur ini terjadi untuk pengguna federasi baru dan pengguna yang sudah ada yang masuk lagi melalui federasi.

![\[Federasi masuk Lambda memicu aliran\]](http://docs.aws.amazon.com/id_id/cognito/latest/developerguide/images/lambda-inbound-federation.png)


## Parameter pemicu Lambda federasi masuk
<a name="cognito-user-pools-lambda-trigger-syntax-inbound-federation"></a>

Permintaan yang diteruskan Amazon Cognito ke fungsi Lambda ini adalah kombinasi dari parameter di bawah ini dan parameter [umum yang ditambahkan Amazon](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html#cognito-user-pools-lambda-trigger-syntax-shared) Cognito ke semua permintaan.

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

------

### Parameter permintaan federasi masuk
<a name="cognito-user-pools-lambda-trigger-syntax-inbound-federation-request"></a>

**ProviderName**  
Nama penyedia identitas eksternal.

**ProviderType**  
Jenis penyedia identitas eksternal. Nilai yang valid:`OIDC`,`SAML`,`Facebook`,`Google`,`SignInWithApple`,`LoginWithAmazon`.

**atribut**  
Atribut mentah yang diterima dari penyedia identitas sebelum diproses. Strukturnya bervariasi berdasarkan jenis penyedia.

**Attributes.TokenResponse**  
OAuth data respons token dari `/token` titik akhir. Hanya tersedia untuk OIDC dan penyedia sosial. Berisi `access_token``id_token`,`refresh_token`,,`token_type`,`expires_in`, dan`scope`.

**Attributes.idToken**  
Klaim JWT token ID yang diterjemahkan dan divalidasi. Hanya tersedia untuk OIDC dan penyedia sosial. Berisi informasi identitas pengguna yang diverifikasi termasuk `sub` (pengenal pengguna unik),, `email``name`, `iss` (penerbit), `aud` (audiens), `exp` (kedaluwarsa), dan `iat` (waktu yang dikeluarkan).

**Attributes.userInfo**  
Informasi profil pengguna yang diperluas dari UserInfo titik akhir. Hanya tersedia untuk OIDC dan penyedia sosial. Berisi atribut profil terperinci seperti`given_name`,,`family_name`, `picture``address`, dan bidang khusus penyedia lainnya. Mungkin kosong jika idP tidak mendukung titik akhir atau jika UserInfo panggilan titik akhir gagal.

**Attributes.samlResponse**  
Atribut pernyataan SAMP. Hanya tersedia untuk penyedia SAMP. Berisi atribut dari respon SAMP.

### Parameter respons federasi masuk
<a name="cognito-user-pools-lambda-trigger-syntax-inbound-federation-response"></a>

**userAttributesToPeta**  
Atribut pengguna untuk diterapkan ke profil pengguna.

**penting**  
Anda harus menyertakan SEMUA atribut pengguna yang ingin Anda pertahankan dalam respons, termasuk atribut yang tidak Anda modifikasi. Atribut apa pun yang tidak termasuk dalam `userAttributesToMap` respons akan dihapus dan tidak disimpan di profil pengguna. Ini berlaku untuk atribut yang dimodifikasi dan tidak dimodifikasi.

**Perilaku respons kosong**  
Jika Anda mengembalikan objek kosong `{}` untuk`userAttributesToMap`, semua atribut asli dari penyedia identitas dipertahankan tidak berubah. Ini bertindak sebagai no-op, seolah-olah fungsi Lambda tidak pernah dieksekusi. Ini berbeda dengan menghilangkan atribut, yang menjatuhkannya.

**Atribut khusus penyedia**  
Struktur `request.attributes` bervariasi berdasarkan`providerType`. OIDC dan penyedia sosial termasuk`tokenResponse`,`idToken`, dan `userInfo` objek. Penyedia SALL hanya menyertakan `samlResponse` objek.

## Contoh federasi masuk: Manajemen keanggotaan grup
<a name="aws-lambda-triggers-inbound-federation-example-groups"></a>

Contoh ini menunjukkan cara memetakan grup penyedia identitas federasi ke grup kumpulan pengguna Amazon Cognito. Fungsi ini mengekstrak keanggotaan grup dari respons federasi dan secara otomatis menambahkan pengguna ke grup Amazon Cognito yang sesuai, menghilangkan kebutuhan akan pemicu pasca-otentikasi.

------
#### [ 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 meneruskan informasi peristiwa ke fungsi Lambda Anda. Fungsi kemudian mengembalikan objek acara yang sama ke Amazon Cognito, dengan perubahan apa pun dalam respons. Di konsol Lambda, Anda dapat mengatur peristiwa pengujian dengan data yang relevan dengan pemicu Lambda Anda. Berikut ini adalah peristiwa pengujian untuk sampel kode ini:

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

------

## Contoh federasi masuk: Memangkas atribut besar
<a name="aws-lambda-triggers-inbound-federation-example-truncate"></a>

Contoh ini menunjukkan cara memotong nilai atribut yang melebihi batas penyimpanan Amazon Cognito. Fungsi ini memeriksa setiap atribut dari penyedia identitas. Jika nilai atribut melebihi 2048 karakter, itu memotong nilai dan menambahkan elipsis untuk menunjukkan pemotongan. Semua atribut lainnya melewati tidak berubah.

------
#### [ 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 meneruskan informasi peristiwa ke fungsi Lambda Anda. Fungsi kemudian mengembalikan objek acara yang sama ke Amazon Cognito, dengan perubahan apa pun dalam respons. Di konsol Lambda, Anda dapat mengatur peristiwa pengujian dengan data yang relevan dengan pemicu Lambda Anda. Berikut ini adalah peristiwa pengujian untuk sampel kode ini:

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

------

## Contoh federasi masuk: Acara federasi logging
<a name="aws-lambda-triggers-inbound-federation-example-logging"></a>

Contoh ini menunjukkan cara mencatat peristiwa otentikasi federasi untuk pemantauan dan debugging. Fungsi contoh ini menangkap informasi rinci tentang pengguna federasi dan atributnya, memberikan visibilitas ke dalam proses otentikasi.

------
#### [ 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 meneruskan informasi peristiwa ke fungsi Lambda Anda. Fungsi kemudian mengembalikan objek acara yang sama ke Amazon Cognito, dengan perubahan apa pun dalam respons. Di konsol Lambda, Anda dapat mengatur peristiwa pengujian dengan data yang relevan dengan pemicu Lambda Anda. Berikut ini adalah peristiwa pengujian untuk sampel kode ini:

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

------

Keluaran CloudWatch Log yang Diharapkan:

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

------