Pemicu Lambda federasi masuk - Amazon Cognito

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

Pemicu Lambda federasi masuk

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 SAMP 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.

Ikhtisar aliran

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

Parameter pemicu Lambda federasi masuk

Permintaan yang diteruskan Amazon Cognito ke fungsi Lambda ini adalah kombinasi dari parameter di bawah ini dan parameter umum yang ditambahkan Amazon 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

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_tokenid_token,refresh_token,,token_type,expires_in, danscope.

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),, emailname, 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 sepertigiven_name,,family_name, pictureaddress, 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

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 {} untukuserAttributesToMap, 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 berdasarkanproviderType. OIDC dan penyedia sosial termasuktokenResponse,idToken, dan userInfo objek. Penyedia SALL hanya menyertakan samlResponse objek.

Contoh federasi masuk: Manajemen keanggotaan grup

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: Memotong atribut besar

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

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" } }