Kirim atribut khusus ke Amazon Cognito dan masukkan ke dalam token - AWS Prescriptive Guidance

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

Kirim atribut khusus ke Amazon Cognito dan masukkan ke dalam token

Carlos Alessandro Ribeiro dan Mauricio Mendoza, Amazon Web Services

Ringkasan

Mengirim atribut khusus ke proses autentikasi Amazon Cognito dapat memberikan konteks tambahan ke aplikasi, mengaktifkan kontrol akses yang lebih terperinci, dan mempermudah pengelolaan profil pengguna dan persyaratan otentikasi. Fitur-fitur ini berguna dalam berbagai aplikasi dan skenario, dan mereka dapat membantu Anda meningkatkan keamanan dan fungsionalitas aplikasi secara keseluruhan.

Pola ini menunjukkan cara mengirim atribut khusus ke proses otentikasi Amazon Cognito saat aplikasi perlu memberikan konteks tambahan ke token akses atau token identitas (ID). Anda menggunakan Node.js sebagai aplikasi backend. Aplikasi ini mengautentikasi pengguna dari kumpulan pengguna Amazon Cognito dan meneruskan atribut khusus yang diperlukan untuk pembuatan token. Anda dapat menggunakan AWS Lambda pemicu untuk Amazon Cognito untuk menyesuaikan proses otentikasi Anda tanpa penyesuaian kode utama atau upaya yang signifikan.

penting

Kode dan sampel dalam pola ini tidak direkomendasikan untuk beban kerja produksi karena ditujukan untuk tujuan demonstrasi saja. Untuk beban kerja produksi, konfigurasi tambahan diperlukan di sisi klien. Gunakan pola ini sebagai referensi untuk pilot atau proof-of-concept tujuan saja.

Prasyarat dan batasan

Prasyarat

Batasan

  • Pola ini tidak berlaku untuk integrasi aplikasi melalui alur otentikasi Client Credentials.

  • Pemicu pembuatan pra-token hanya dapat menambah atau mengubah beberapa atribut token akses dan token identitas. Untuk informasi selengkapnya, lihat Pemicu Lambda pra pembuatan token di dokumentasi Amazon Cognito.

Arsitektur

Arsitektur target

Diagram berikut menunjukkan arsitektur target untuk pola ini. Ini juga menunjukkan bagaimana aplikasi Node.js dapat bekerja dengan backend untuk memperbarui database. Namun, pembaruan basis data backend berada di luar cakupan pola ini.

Aplikasi Node.js yang mengeluarkan token akses dengan atribut khusus ke kumpulan pengguna Amazon Cognito.

Diagram menunjukkan alur kerja berikut:

  1. Aplikasi Node.js mengeluarkan token akses dengan atribut khusus ke kumpulan pengguna Amazon Cognito.

  2. Kumpulan pengguna Amazon Cognito memulai fungsi Lambda generasi pra-token, yang menyesuaikan akses dan token ID.

  3. Aplikasi Node.js melakukan panggilan API melalui Amazon API Gateway.

catatan

Komponen arsitektur lain yang ditunjukkan dalam arsitektur ini misalnya saja dan berada di luar cakupan pola ini.

Otomatisasi dan skala

Anda dapat mengotomatiskan penyediaan kumpulan pengguna Amazon Cognito, AWS Lambda fungsi, instance database, dan sumber daya lainnya dengan menggunakan, HashiCorp Terraform AWS CloudFormation, atau alat infrastruktur AWS Cloud Development Kit (AWS CDK)sebagai kode (IAc) yang didukung. Jika Anda ingin menskalakan penerapan Anda, gunakan pipeline integrasi berkelanjutan dan pengiriman berkelanjutan (CI/CD), yang membantu mencegah kesalahan yang terkait dengan penerapan manual.

Alat

Layanan AWS

  • Amazon API Gateway membantu Anda membuat, menerbitkan, memelihara, memantau, dan mengamankan REST, HTTP, dan WebSocket APIs dalam skala apa pun.

  • Amazon Cognito menyediakan otentikasi, otorisasi, dan manajemen pengguna untuk aplikasi web dan seluler.

  • Amazon Elastic Container Service (Amazon ECS) adalah layanan manajemen kontainer yang cepat dan dapat diskalakan yang membantu Anda menjalankan, menghentikan, dan mengelola kontainer di klaster.

  • AWS Lambdaadalah layanan komputasi yang membantu Anda menjalankan kode tanpa perlu menyediakan atau mengelola server. Ini menjalankan kode Anda hanya bila diperlukan dan skala secara otomatis, jadi Anda hanya membayar untuk waktu komputasi yang Anda gunakan.

  • AWS SDK untuk JavaScriptmenyediakan JavaScript API untuk Layanan AWS. Anda dapat menggunakannya untuk membangun pustaka atau aplikasi untuk Node.js atau browser.

Alat-alat lainnya

  • Node.js adalah lingkungan JavaScript runtime berbasis peristiwa yang dirancang untuk membangun aplikasi jaringan yang dapat diskalakan.

  • npm adalah registri perangkat lunak yang berjalan di lingkungan Node.js dan digunakan untuk berbagi atau meminjam paket dan mengelola penyebaran paket pribadi.

Praktik terbaik

Kami menyarankan Anda menerapkan praktik terbaik berikut:

  • Rahasia dan data sensitif — Jangan menyimpan rahasia atau data sensitif dalam aplikasi. Gunakan sistem eksternal tempat aplikasi dapat menarik data dari, seperti AWS AppConfigAWS Secrets Manager, atau AWS Systems Manager Parameter Store.

  • Penerapan standar — Gunakan CI/CD pipeline untuk menyebarkan aplikasi Anda. Anda dapat menggunakan layanan seperti AWS CodeBuilddan AWS CodePipeline.

  • Token kedaluwarsa — Tetapkan tanggal kedaluwarsa singkat untuk token akses.

  • Gunakan koneksi aman — Semua komunikasi antara aplikasi klien dan backend harus dienkripsi dengan menggunakan SSL/TLS. Gunakan AWS Certificate Manager (ACM) untuk membuat dan mengelola SSL/TLS sertifikat, dan gunakan Amazon CloudFront atau Elastic Load Balancing untuk SSL/TLS menangani penghentian.

  • Validasi input pengguna — Pastikan semua input pengguna divalidasi untuk mencegah serangan injeksi dan kerentanan keamanan lainnya. Gunakan pustaka validasi input dan layanan seperti Amazon API Gateway dan AWS WAFuntuk mencegah vektor serangan umum.

  • Gunakan peran IAM — Gunakan peran AWS Identity and Access Management (IAM) untuk mengontrol akses ke AWS sumber daya dan memastikan bahwa hanya pengguna yang berwenang yang memiliki akses. Ikuti prinsip hak istimewa paling sedikit dan pastikan bahwa setiap pengguna hanya memiliki izin yang diperlukan untuk melakukan peran mereka.

  • Gunakan kebijakan kata sandi — Konfigurasikan kebijakan kata sandi yang memenuhi persyaratan keamanan Anda, seperti panjang minimum, kompleksitas, dan kedaluwarsa. Gunakan Secrets Manager atau AWS Systems Manager Parameter Store untuk menyimpan dan mengelola kata sandi dengan aman.

  • Aktifkan otentikasi multi-faktor (MFA) — Aktifkan MFA bagi semua pengguna untuk menyediakan lapisan keamanan tambahan dan mengurangi risiko akses yang tidak sah. Gunakan AWS IAM Identity Centeratau Amazon Cognito untuk mengaktifkan MFA dan metode otentikasi lainnya.

  • Simpan informasi sensitif dengan aman — Simpan informasi sensitif, seperti kata sandi dan token akses, dengan aman menggunakan AWS Key Management Service (AWS KMS) atau layanan enkripsi lainnya.

  • Gunakan metode otentikasi yang kuat — Untuk meningkatkan keamanan proses otentikasi, gunakan metode otentikasi yang kuat, seperti otentikasi biometrik atau otentikasi multi-faktor.

  • Memantau aktivitas yang mencurigakan — Gunakan AWS CloudTraildan alat pemantauan lainnya untuk memantau aktivitas mencurigakan dan potensi ancaman keamanan. Siapkan peringatan otomatis untuk aktivitas yang tidak biasa, dan gunakan Amazon GuardDuty atau AWS Security Hubuntuk mendeteksi potensi ancaman.

  • Tinjau dan perbarui kebijakan keamanan secara berkala — Tinjau dan perbarui kebijakan dan prosedur keamanan Anda secara teratur untuk memastikan bahwa kebijakan tersebut memenuhi persyaratan keamanan dan praktik terbaik Anda yang berubah. Gunakan AWS Config untuk melacak dan mengaudit perubahan pada kebijakan dan prosedur keamanan Anda.

  • Pendaftaran otomatis — Jangan aktifkan pendaftaran otomatis ke kumpulan pengguna Amazon Cognito. Untuk informasi selengkapnya, lihat Mengurangi risiko penipuan pendaftaran pengguna dan pemompaan SMS dengan kumpulan pengguna Amazon CognitoAWS (posting blog).

Untuk praktik terbaik tambahan, lihat Praktik terbaik keamanan untuk kumpulan pengguna Amazon Cognito di dokumentasi Amazon Cognito.

Epik

TugasDeskripsiKeterampilan yang dibutuhkan

Membuat pengguna.

  1. Di terminal CLI, masukkan perintah berikut untuk membuat kumpulan pengguna Amazon Cognito:

    aws cognito-idp create-user-pool \ --pool-name <MyUserPool>
  2. Masukkan perintah berikut untuk membuat ID klien dan rahasia yang akan digunakan dengan SDK untuk JavaScript:

    aws cognito-idp create-user-pool-client \ --user-pool-id <UserPoolID> \ --client-name <MyNewClient> \ --no-generate-secret \ --explicit-auth-flows "USER_PASSWORD_AUTH" "ADMIN_NO_SRP_AUTH"

Untuk informasi selengkapnya dan petunjuk tentang cara menyiapkan kumpulan pengguna di AWS Management Console, lihat Memulai kumpulan pengguna dan Menambahkan lebih banyak fitur dan opsi keamanan ke kumpulan pengguna Anda.

Tip

Untuk mengurangi biaya, gunakan paket Essentials atau paket Lite untuk menguji pola ini. Untuk informasi selengkapnya, lihat harga Amazon Cognito.

Pengembang aplikasi, AWS DevOps

Tambahkan pengguna ke kumpulan pengguna.

Masukkan perintah berikut untuk membuat satu pengguna di kumpulan pengguna Amazon Cognito:

aws cognito-idp sign-up \ --client-id <ClientID> \ --username <jane@example.com> \ --password <PASSWORD> \ --user-attributes Name="email",Value="<jane@example.com>" Name="name",Value="<Jane>"
Pengembang aplikasi, AWS DevOps

Tambahkan klien aplikasi ke kumpulan pengguna.

  1. Arahkan ke konsol Amazon Cognito.

  2. Pilih kumpulan Pengguna.

  3. Pilih kumpulan pengguna yang Anda buat sebelumnya.

  4. Di bawah Tentukan aplikasi Anda, pilih jenis Aplikasi yang paling sesuai dengan skenario aplikasi yang ingin Anda buat layanan otentikasi dan otorisasi.

  5. Dalam Nama aplikasi Anda, masukkan nama deskriptif atau lanjutkan dengan nama default.

  6. Di bawah Tambahkan URL pengembalian, masukkan jalur pengalihan ke aplikasi Anda setelah pengguna menyelesaikan otentikasi.

  7. Pilih Buat aplikasi Anda. Anda dapat mengatur opsi lanjutan setelah membuat klien aplikasi.

Administrator sistem AWS, administrator AWS, AWS DevOps, Pengembang aplikasi

Buat pemicu Lambda untuk pembuatan pra-token.

  1. Buka halaman Fungsi di konsol Lambda.

  2. Pilih Buat fungsi.

  3. Pilih Penulis dari awal.

  4. Di panel Informasi dasar, untuk nama Fungsi, masukkanmyPreTokenGenerationLambdaFunction.

  5. Untuk Runtime, pilih Node.js 22.

  6. Biarkan arsitektur disetel ke x86_64.

  7. Pilih Buat fungsi.

  8. Pada tab Kode, di bawah Sumber Kode, masukkan contoh fungsi Lambda dari bagian Sumber daya tambahan dari pola ini. Fungsi Lambda ini menyuntikkan atribut kustom ke token ID dan token akses.

AWS DevOps, Pengembang aplikasi

Sesuaikan alur kerja kumpulan pengguna.

  1. Arahkan ke konsol Amazon Cognito.

  2. Pilih kumpulan Pengguna.

  3. Pilih kumpulan pengguna yang Anda buat sebelumnya.

  4. Di panel navigasi kiri, di bawah Otentikasi, pilih Ekstensi.

  5. Pilih Tambahkan pemicu Lambda.

  6. Tambahkan atau edit pemicu pembuatan Pra token.

  7. Untuk tipe Trigger, pilih Authentication.

  8. Di bawah Otentikasi, pilih Pre token generation trigger.

  9. Untuk fungsi Tetapkan Lambda, pilih. myPreTokenGenerationLambdaFunction

  10. Pilih Tambahkan pemicu Lambda.

  11. Pilih versi acara Trigger dari fitur Dasar+kustomisasi token akses untuk identitas pengguna atau Fitur dasar+kustomisasi token akses untuk identitas pengguna dan mesin. Pengaturan ini memperbarui parameter permintaan yang dikirimkan Amazon Cognito ke fungsi Anda untuk menyertakan bidang untuk kustomisasi token akses.

Untuk informasi selengkapnya, lihat Menyesuaikan alur kerja kumpulan pengguna dengan pemicu Lambda di dokumentasi Amazon Cognito.

AWS DevOps, Pengembang aplikasi
TugasDeskripsiKeterampilan yang dibutuhkan

Buat aplikasi Node.js.

  1. Di terminal, masukkan perintah berikut:

    mkdir my-app cd my-app npm init -y npm install --save-dev typescript npm i --save-dev @types/node npm i amazon-cognito-identity-js npx tsc --init mkdir src touch src/index.ts
  2. Ubah package.json file untuk menyertakan skrip TypeScript kompilasi:

    "scripts": { "start": "node src/index.js", "build": "tsc" },
Pengembang aplikasi

Menerapkan logika otentikasi.

  1. Buka file index.ts.

  2. Tempel sampel TypeScript yang disediakan di bagian Sumber daya tambahan dari pola ini.

  3. Simpan dan tutup file index.ts.

catatan

Anda dapat membuat TypeScript file Anda sendiri atau memodifikasi sampel yang disediakan sesuai kebutuhan untuk kasus penggunaan Anda.

Pengembang aplikasi

Konfigurasikan variabel lingkungan dan file konfigurasi.

Di terminal, masukkan perintah berikut untuk membuat variabel lingkungan:

export USERNAME="<COGNITO_USER_NAME>" export PASSWORD="<COGNITO_USER_PASSWORD>" export USER_POOL_ID="<COGNITO_USER_ID>" export CLIENT_ID="<COGNITO_CLIENT_ID>"
penting

Jangan membuat hardcode rahasia atau mengekspos kredensialmu.

Pengembang aplikasi

Jalankan aplikasi.

Masukkan perintah berikut untuk menjalankan aplikasi dan konfirmasikan bahwa itu berfungsi:

npm run build npm start
Pengembang aplikasi

Konfirmasikan bahwa atribut khusus disuntikkan ke token.

Gunakan fitur debugging untuk IDE Anda untuk melihat akses dan token ID. Konfirmasikan bahwa atribut kustom telah ditambahkan. Untuk contoh token, lihat bagian Informasi tambahan dari pola ini.

Pengembang aplikasi

Pemecahan Masalah

IsuSolusi

ID klien tidak valid saat mencoba mengautentikasi pengguna

Kesalahan ini biasanya terjadi ketika Anda menggunakan ID klien dengan rahasia klien yang dihasilkan. Anda harus membuat ID klien tanpa rahasia yang melekat padanya. Untuk informasi selengkapnya, lihat Pengaturan khusus aplikasi dengan klien aplikasi.

Sumber daya terkait

Informasi tambahan

Contoh TypeScript berkas

Contoh kode berikut adalah TypeScript file yang memanggil proses otentikasi menggunakan AWS SDK untuk mengirim atribut kustom ke Amazon Cognito:

import * as AmazonCognitoIdentity from "amazon-cognito-identity-js"; const userPoolId: string = process.env.USER_POOL_ID ?? ''; const clientId: string = process.env.CLIENT_ID ?? ''; const poolData = { UserPoolId: userPoolId, ClientId: clientId }; const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData); export const loginWithCognitoSDK = function (userName: string, password: string) { const authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails({ Username: userName, Password: password, ClientMetadata: { customGroup: "MyCustomGroup", customApplicationData: "Custom data from a custom application" } }); const userData = { Username: userName, Pool: userPool }; const cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData); // Authenticate the user using the authenticationDetails object cognitoUser.authenticateUser(authenticationDetails, { onSuccess: function (result: any) {}, onFailure: function (err: any) {}, }); } loginWithCognitoSDK(process.env.USERNAME ?? '', process.env.PASSWORD ?? '');

Sampel menggunakan AuthenticationDetails model dari SDK JavaScript untuk memberikan nama pengguna, kata sandi, dan file. ClientMetadada Setelah otentikasi di Amazon Cognito, metadata klien dapat diambil dari token akses dan ID.

Contoh fungsi Lambda

Contoh kode berikut adalah fungsi Lambda yang ditautkan ke Token Pra-Generasi dari Amazon Cognito. Ini membantu Anda menyesuaikan token akses dan token ID yang digunakan Amazon Cognito. Token dilewatkan melalui integrasi antara arsitektur Anda. Contoh ini mencakup atribut klaim kustom yang dipanggil customApplicationData dan nama grup kustom yang disebutMyCustomGroup:

export const handler = async(event, context, callback) => { event.response = { claimsOverrideDetails: { claimsToAddOrOverride: { customApplicationData: event.request.clientMetadata.customApplicationData }, groupOverrideDetails: { groupsToOverride: [event.request.clientMetadata.customGroup] } } }; callback(null, event); };

Contoh token akses

Anda dapat memecahkan kode token akses untuk memvisualisasikan atribut kustom yang ditambahkan. Berikut ini adalah contoh token akses:

{ "sub": "6daf331f-4451-48b4-abde-774579299204", "cognito:groups": [ "MyCustomGroup" ], "iss": "https://cognito-idp.<REGION>.amazonaws.com/<USERPOOL_ID>", "client_id": "<YOUR_CLIENT_ID>", "origin_jti": "acff7e91-09f9-4fde-8eec-38b0f8c47cdc", "event_id": "c5113a9c-1f01-435b-9b73-a5cd3e88514e", "token_use": "access", "scope": "aws.cognito.signin.user.admin", "auth_time": 1677979246, "exp": 1677982846, "iat": 1677979246, "jti": "5c9c2708-a871-4428-bd9b-18ad261bea90", "username": "<USER_NAME>" }

Contoh ID token

Anda dapat memecahkan kode token akses untuk memvisualisasikan atribut kustom yang ditambahkan. Berikut ini adalah contoh token akses:

{ "sub": "6daf331f-4451-48b4-abde-774579299204", "cognito:groups": [ "MyCustomGroup" ], "iss": "https://cognito-idp.<REGION>.amazonaws.com/<USERPOOL_ID>", "cognito:username": "<USER_NAME>", "origin_jti": "acff7e91-09f9-4fde-8eec-38b0f8c47cdc", "customApplicationData": "Custom data from a custom application", "aud": "<YOUR_CLIENT_ID>", "event_id": "c5113a9c-1f01-435b-9b73-a5cd3e88514e", "token_use": "id", "auth_time": 1677979246, "exp": 1677982846, "iat": 1677979246, "jti": "f7ca006b-f25b-44d2-a7a4-6e6423f4201f", "email": "<USER_EMAIL>" }