

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

# Tantangan otentikasi khusus pemicu Lambda
<a name="user-pool-lambda-challenge"></a>

Saat membuat alur autentikasi untuk kumpulan pengguna Amazon Cognito, Anda mungkin menemukan bahwa Anda ingin memperluas model autentikasi di luar alur bawaan. Salah satu kasus penggunaan umum untuk pemicu tantangan khusus adalah menerapkan pemeriksaan keamanan tambahan di luar nama pengguna, kata sandi, dan otentikasi multi-faktor (MFA). Tantangan khusus adalah pertanyaan dan respons apa pun yang dapat Anda hasilkan dalam bahasa pemrograman yang didukung Lambda. Misalnya, Anda mungkin ingin meminta pengguna untuk memecahkan CAPTCHA atau menjawab pertanyaan keamanan sebelum diizinkan untuk mengautentikasi. Kebutuhan potensial lainnya adalah berintegrasi dengan faktor atau perangkat otentikasi khusus. Atau Anda mungkin telah mengembangkan perangkat lunak yang mengautentikasi pengguna dengan kunci keamanan perangkat keras atau perangkat biometrik. Definisi keberhasilan otentikasi untuk tantangan khusus adalah jawaban apa pun yang diterima fungsi Lambda Anda sebagai benar: string tetap, misalnya, atau respons yang memuaskan dari API eksternal.

Anda dapat memulai otentikasi dengan tantangan kustom Anda dan mengontrol proses otentikasi sepenuhnya, atau Anda dapat melakukan otentikasi nama pengguna kata sandi sebelum aplikasi Anda menerima tantangan khusus Anda.

Tantangan otentikasi khusus pemicu Lambda:

**[Mendefinisikan](user-pool-lambda-define-auth-challenge.md)**  
Memulai urutan tantangan. Menentukan apakah Anda ingin memulai tantangan baru, menandai otentikasi sebagai selesai, atau menghentikan upaya otentikasi.

**[Menciptakan](user-pool-lambda-create-auth-challenge.md)**  
Mengeluarkan pertanyaan ke aplikasi Anda yang harus dijawab pengguna. Fungsi ini mungkin menyajikan pertanyaan keamanan atau tautan ke CAPTCHA yang harus ditampilkan aplikasi Anda kepada pengguna Anda.

**[Memverifikasi](user-pool-lambda-verify-auth-challenge-response.md)**  
Mengetahui jawaban yang diharapkan dan membandingkannya dengan jawaban yang diberikan aplikasi Anda dalam respons tantangan. Fungsi ini mungkin memanggil API layanan CAPTCHA Anda untuk mengambil hasil yang diharapkan dari solusi yang dicoba pengguna Anda.

Ketiga fungsi Lambda ini berantai bersama untuk menghadirkan mekanisme otentikasi yang sepenuhnya berada dalam kendali Anda dan desain Anda sendiri. Karena otentikasi kustom memerlukan logika aplikasi di klien Anda dan dalam fungsi Lambda, Anda tidak dapat memproses otentikasi kustom dalam login terkelola. Sistem otentikasi ini membutuhkan upaya pengembang tambahan. Aplikasi Anda harus menjalankan alur otentikasi dengan API kumpulan pengguna dan menangani tantangan yang dihasilkan dengan antarmuka login yang dibuat khusus yang membuat pertanyaan di tengah tantangan otentikasi kustom.

![Pemicu Lambda tantangan](http://docs.aws.amazon.com/id_id/cognito/latest/developerguide/images/lambda-challenges.png)


Untuk informasi selengkapnya tentang menerapkan otentikasi kustom, lihat [Alur otentikasi kustom dan tantangan](amazon-cognito-user-pools-authentication-flow-methods.md#Custom-authentication-flow-and-challenges)

Otentikasi antara operasi API [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)atau [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html), dan [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)atau [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html). Dalam alur ini, pengguna mengautentikasi dengan menjawab tantangan berturut-turut sampai autentikasi gagal atau pengguna mengeluarkan token. Respons tantangan bisa menjadi tantangan baru. Dalam hal ini, aplikasi Anda merespons tantangan baru sebanyak yang diperlukan. Otentikasi yang berhasil terjadi ketika fungsi define auth challenge menganalisis hasil sejauh ini, menentukan semua tantangan telah dijawab, dan kembali. `IssueTokens`

**Topics**
+ [Otentikasi SRP dalam alur tantangan khusus](#user-pool-lambda-challenge-srp-authentication)
+ [Tentukan tantangan Auth pemicu Lambda](user-pool-lambda-define-auth-challenge.md)
+ [Buat tantangan Auth pemicu Lambda](user-pool-lambda-create-auth-challenge.md)
+ [Verifikasi respons tantangan Auth Pemicu Lambda](user-pool-lambda-verify-auth-challenge-response.md)

## Otentikasi SRP dalam alur tantangan khusus
<a name="user-pool-lambda-challenge-srp-authentication"></a>

Anda dapat meminta Amazon Cognito memverifikasi kata sandi pengguna sebelum mengeluarkan tantangan kustom Anda. Setiap pemicu Lambda yang terkait dalam kategori Otentikasi [kuota tingkat permintaan](quotas.md#category_operations.title) akan berjalan saat Anda melakukan otentikasi SRP dalam alur tantangan khusus. Berikut adalah gambaran umum prosesnya:

1. Aplikasi Anda memulai proses masuk dengan memanggil `InitiateAuth` atau menggunakan `AdminInitiateAuth` peta. `AuthParameters` Parameter harus mencakup `CHALLENGE_NAME: SRP_A,` dan nilai untuk `SRP_A` dan`USERNAME`.

1. Amazon Cognito memanggil pemicu Lambda tantangan autentikasi definisi Anda dengan sesi awal yang berisi dan. `challengeName: SRP_A` `challengeResult: true`

1. Setelah menerima masukan tersebut, fungsi Lambda Anda merespons dengan `challengeName: PASSWORD_VERIFIER`, `issueTokens: false`, `failAuthentication: false`.

1. Jika verifikasi kata sandi berhasil, Amazon Cognito memanggil fungsi Lambda Anda lagi dengan sesi baru yang berisi dan. `challengeName: PASSWORD_VERIFIER` `challengeResult: true`

1. Untuk memulai tantangan kustom Anda, fungsi Lambda Anda merespons `challengeName: CUSTOM_CHALLENGE` dengan`issueTokens: false`,, dan. `failAuthentication: false` Jika Anda tidak ingin memulai alur autentikasi kustom dengan verifikasi kata sandi, Anda dapat memulai masuk dengan peta `AuthParameters` termasuk `CHALLENGE_NAME: CUSTOM_CHALLENGE`.

1. Putaran tantangan berulang sampai semua tantangan terjawab.

Berikut ini adalah contoh `InitiateAuth` permintaan awal yang mendahului otentikasi kustom dengan aliran SRP.

```
{
    "AuthFlow": "CUSTOM_AUTH",
    "ClientId": "1example23456789",
    "AuthParameters": {
        "CHALLENGE_NAME": "SRP_A",
        "USERNAME": "testuser",
        "SRP_A": "[SRP_A]",
        "SECRET_HASH": "[secret hash]"
    }
}
```

### Reset kata sandi dalam aliran SRP otentikasi khusus
<a name="user-pool-lambda-challenge-force-password-change"></a>

Ketika pengguna dalam `FORCE_CHANGE_PASSWORD` status, alur otentikasi kustom Anda harus mengintegrasikan langkah perubahan kata sandi sambil mempertahankan integritas tantangan otentikasi Anda. Amazon Cognito memanggil pemicu Lambda tantangan [autentikasi definisi Anda selama tantangan](user-pool-lambda-define-auth-challenge.md). `NEW_PASSWORD_REQUIRED` Dalam skenario ini, pengguna yang masuk dengan alur tantangan khusus dan otentikasi SRP dapat menyetel kata sandi baru jika mereka berada dalam status pengaturan ulang kata sandi.

Ketika pengguna berada dalam `FORCE_CHANGE_PASSWORD` status `RESET_REQUIRED` atau, mereka harus [menanggapi](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html#API_RespondToAuthChallenge_RequestParameters) `NEW_PASSWORD_REQUIRED` tantangan dengan`NEW_PASSWORD`. Dalam otentikasi khusus dengan SRP, Amazon Cognito mengembalikan `NEW_PASSWORD_REQUIRED` tantangan setelah pengguna menyelesaikan tantangan SRP. `PASSWORD_VERIFIER` Pemicu tantangan autentikasi definisi Anda menerima kedua hasil tantangan dalam `session` larik, dan dapat melanjutkan dengan tantangan khusus tambahan setelah pengguna berhasil mengubah kata sandi mereka.

Tantangan autentikasi definisi Anda Pemicu Lambda harus mengelola urutan tantangan melalui otentikasi SRP, pengaturan ulang kata sandi, dan tantangan khusus berikutnya. Pemicu menerima serangkaian tantangan yang diselesaikan dalam `session` parameter, termasuk keduanya `PASSWORD_VERIFIER` dan `NEW_PASSWORD_REQUIRED` hasil. Untuk contoh implementasi, lihat[Tentukan contoh tantangan Auth](user-pool-lambda-define-auth-challenge.md#aws-lambda-triggers-define-auth-challenge-example).

#### Langkah-langkah aliran otentikasi
<a name="user-pool-lambda-challenge-password-flow-steps"></a>

Untuk pengguna yang perlu memverifikasi kata sandi mereka sebelum tantangan khusus, prosesnya mengikuti langkah-langkah berikut:

1. Aplikasi Anda memulai proses masuk dengan memanggil `InitiateAuth` atau menggunakan `AdminInitiateAuth` peta. `AuthParameters` Parameter harus mencakup`CHALLENGE_NAME: SRP_A`, dan nilai untuk `SRP_A` dan`USERNAME`.

1. Amazon Cognito memanggil pemicu Lambda tantangan autentikasi definisi Anda dengan sesi awal yang berisi dan. `challengeName: SRP_A` `challengeResult: true`

1. Setelah menerima masukan tersebut, fungsi Lambda Anda merespons dengan `challengeName: PASSWORD_VERIFIER`, `issueTokens: false`, `failAuthentication: false`.

1. Jika verifikasi kata sandi berhasil, salah satu dari dua hal terjadi:  
**Untuk pengguna dalam status normal:**  
Amazon Cognito memanggil fungsi Lambda Anda lagi dengan sesi baru yang berisi dan. `challengeName: PASSWORD_VERIFIER` `challengeResult: true`  
Untuk memulai tantangan kustom Anda, fungsi Lambda Anda merespons `challengeName: CUSTOM_CHALLENGE` dengan`issueTokens: false`,, dan. `failAuthentication: false`  
**Untuk pengguna dalam `RESET_REQUIRED` atau `FORCE_CHANGE_PASSWORD` status:**  
Amazon Cognito memanggil fungsi Lambda Anda dengan sesi yang berisi dan. `challengeName: PASSWORD_VERIFIER` `challengeResult: true`  
Fungsi Lambda Anda harus merespons dengan`challengeName: NEW_PASSWORD_REQUIRED`,`issueTokens: false`, dan. `failAuthentication: false`  
Setelah berhasil mengubah kata sandi, Amazon Cognito memanggil fungsi Lambda Anda dengan sesi yang berisi hasil dan hasil. `PASSWORD_VERIFIER` `NEW_PASSWORD_REQUIRED`  
Untuk memulai tantangan kustom Anda, fungsi Lambda Anda merespons `challengeName: CUSTOM_CHALLENGE` dengan`issueTokens: false`,, dan. `failAuthentication: false`

1. Putaran tantangan berulang sampai semua tantangan terjawab.

Jika Anda tidak ingin memulai alur autentikasi kustom dengan verifikasi kata sandi, Anda dapat memulai masuk dengan peta `AuthParameters` termasuk `CHALLENGE_NAME: CUSTOM_CHALLENGE`.

#### Manajemen sesi
<a name="user-pool-lambda-challenge-session-management"></a>

Alur otentikasi mempertahankan kontinuitas sesi melalui serangkaian sesi IDs dan hasil tantangan. Setiap respons tantangan menghasilkan ID sesi baru untuk mencegah kesalahan penggunaan kembali sesi, yang sangat penting untuk alur otentikasi multi-faktor.

Hasil tantangan disimpan secara kronologis dalam larik sesi yang diterima pemicu Lambda Anda. Untuk pengguna dalam `FORCE_CHANGE_PASSWORD` status, larik sesi berisi:

1. `session[0]`- `SRP_A` Tantangan awal

1. `session[1]`- `PASSWORD_VERIFIER` hasil

1. `session[2]`- `NEW_PASSWORD_REQUIRED` hasil

1. Elemen selanjutnya - Hasil tantangan khusus tambahan

#### Contoh aliran otentikasi
<a name="user-pool-lambda-challenge-example-flow"></a>

Contoh berikut menunjukkan alur otentikasi kustom lengkap untuk pengguna dalam `FORCE_CHANGE_PASSWORD` status yang harus menyelesaikan perubahan kata sandi dan tantangan CAPTCHA kustom.

1. **InitiateAuth permintaan**

   ```
   {
       "AuthFlow": "CUSTOM_AUTH",
       "ClientId": "{{1example23456789}}",
       "AuthParameters": {
           "CHALLENGE_NAME": "SRP_A",
           "USERNAME": "{{testuser}}",
           "SRP_A": "{{[SRP_A]}}"
       }
   }
   ```

1. **InitiateAuth respon**

   ```
   {
       "ChallengeName": "PASSWORD_VERIFIER",
       "ChallengeParameters": {
           "USER_ID_FOR_SRP": "{{testuser}}"
       },
       "Session": "{{[session_id_1]}}"
   }
   ```

1. **RespondToAuthChallenge permintaan dengan `PASSWORD_VERIFIER`**

   ```
   {
       "ChallengeName": "PASSWORD_VERIFIER",
       "ClientId": "{{1example23456789}}",
       "ChallengeResponses": {
           "PASSWORD_CLAIM_SIGNATURE": "{{[claim_signature]}}",
           "PASSWORD_CLAIM_SECRET_BLOCK": "{{[secret_block]}}",
           "TIMESTAMP": "{{[timestamp]}}",
           "USERNAME": "{{testuser}}"
       },
       "Session": "{{[session_id_1]}}"
   }
   ```

1. **RespondToAuthChallenge respon dengan `NEW_PASSWORD_REQUIRED` tantangan**

   ```
   {
       "ChallengeName": "NEW_PASSWORD_REQUIRED",
       "ChallengeParameters": {},
       "Session": "{{[session_id_2]}}"
   }
   ```

1. **RespondToAuthChallenge permintaan dengan `NEW_PASSWORD_REQUIRED`**

   ```
   {
       "ChallengeName": "NEW_PASSWORD_REQUIRED",
       "ClientId": "{{1example23456789}}",
       "ChallengeResponses": {
           "NEW_PASSWORD": "{{[password]}}",
           "USERNAME": "{{testuser}}"
       },
       "Session": "{{[session_id_2]}}"
   }
   ```

1. **RespondToAuthChallenge respon dengan tantangan kustom CAPTCHA**

   ```
   {
       "ChallengeName": "CUSTOM_CHALLENGE",
       "ChallengeParameters": {
           "captchaUrl": "url/123.jpg"
       },
       "Session": "{{[session_id_3]}}"
   }
   ```

1. **RespondToAuthChallenge permintaan dengan jawaban untuk tantangan kustom CAPTCHA**

   ```
   {
       "ChallengeName": "CUSTOM_CHALLENGE",
       "ClientId": "{{1example23456789}}",
       "ChallengeResponses": {
           "ANSWER": "{{123}}",
           "USERNAME": "{{testuser}}"
       },
       "Session": "{{[session_id_3]}}"
   }
   ```

**6. Respon sukses akhir**

```
{
    "AuthenticationResult": {
        "AccessToken": "{{eyJra456defEXAMPLE}}",
        "ExpiresIn": 3600,
        "IdToken": "{{eyJra789ghiEXAMPLE}}",
        "RefreshToken": "{{eyJjd123abcEXAMPLE}}",
        "TokenType": "Bearer"
    },
    "ChallengeParameters": {}
}
```