

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

# Tentukan tantangan Auth pemicu Lambda
<a name="user-pool-lambda-define-auth-challenge"></a>

Pemicu tantangan autentikasi definisi adalah fungsi Lambda yang mempertahankan urutan tantangan dalam alur otentikasi khusus. Ini menyatakan keberhasilan atau kegagalan urutan tantangan, dan menetapkan tantangan berikutnya jika urutannya belum selesai.

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


**Menentukan tantangan autentikasi**  
 Amazon Cognito memanggil pemicu ini untuk memulai [alur autentikasi kustom](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html#amazon-cognito-user-pools-custom-authentication-flow).

Permintaan untuk pemicu Lambda ini berisi. `session` `session`Parameter adalah array yang berisi semua tantangan yang disajikan kepada pengguna dalam proses otentikasi saat ini. Permintaan juga mencakup hasil yang sesuai. `session`Array menyimpan detail tantangan (`ChallengeResult`) dalam urutan kronologis. Tantangan tersebut `session[0]` merupakan tantangan pertama yang diterima pengguna.

**Topics**
+ [Tentukan parameter pemicu Lambda tantangan Auth](#cognito-user-pools-lambda-trigger-syntax-define-auth-challenge)
+ [Tentukan contoh tantangan Auth](#aws-lambda-triggers-define-auth-challenge-example)

## Tentukan parameter pemicu Lambda tantangan Auth
<a name="cognito-user-pools-lambda-trigger-syntax-define-auth-challenge"></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 ]

```
{
    "request": {
        "userAttributes": {
            "string": "string",
                . . .
        },
        "session": [
            ChallengeResult,
            . . .
        ],
        "clientMetadata": {
            "string": "string",
            . . .
        },
        "userNotFound": boolean
    },
    "response": {
        "challengeName": "string",
        "issueTokens": boolean,
        "failAuthentication": boolean
    }
}
```

------

### Tentukan parameter permintaan tantangan Auth
<a name="cognito-user-pools-lambda-trigger-syntax-define-auth-challenge-request"></a>

 Saat Amazon Cognito memanggil fungsi Lambda Anda, Amazon Cognito menyediakan parameter berikut:

**userAttributes**  
Satu atau lebih pasangan nama-nilai yang mewakili atribut pengguna.

**userNotFound**  
Boolean yang diisi Amazon Cognito `PreventUserExistenceErrors` saat disetel `ENABLED` untuk klien kumpulan pengguna Anda. Nilai `true` berarti bahwa id pengguna (nama pengguna, alamat email, dan detail lainnya) tidak cocok dengan pengguna yang ada. Bila `PreventUserExistenceErrors` disetel ke`ENABLED`, layanan tidak menginformasikan aplikasi pengguna yang tidak ada. Kami menyarankan agar fungsi Lambda Anda mempertahankan pengalaman pengguna yang sama dan memperhitungkan latensi. Dengan cara ini, pemanggil tidak dapat mendeteksi perilaku yang berbeda ketika pengguna ada atau tidak ada.

**sesi**  
Array `ChallengeResult` elemen. Masing-masing berisi elemen-elemen berikut:    
**challengeName**  
Salah satu jenis tantangan berikut:`CUSTOM_CHALLENGE`,`SRP_A`,`PASSWORD_VERIFIER`,`SMS_MFA`, `EMAIL_OTP``SOFTWARE_TOKEN_MFA`,`DEVICE_SRP_AUTH`,`DEVICE_PASSWORD_VERIFIER`, atau`ADMIN_NO_SRP_AUTH`.  
Saat fungsi define auth challenge Anda mengeluarkan `PASSWORD_VERIFIER` tantangan bagi pengguna yang telah menyiapkan otentikasi multifaktor, Amazon Cognito menindaklanjutinya dengan,, atau `SMS_MFA` tantangan. `EMAIL_OTP` `SOFTWARE_TOKEN_MFA` Ini adalah petunjuk untuk kode otentikasi multi-faktor. Dalam fungsi Anda, sertakan penanganan untuk acara masukan dari `SMS_MFA``EMAIL_OTP`,, dan `SOFTWARE_TOKEN_MFA` tantangan. Anda tidak perlu memanggil tantangan MFA apa pun dalam fungsi tantangan autentikasi definisi Anda.  
Saat fungsi Anda menentukan apakah pengguna telah berhasil diautentikasi dan Anda harus mengeluarkannya token, selalu periksa `challengeName` fungsi define auth challenge Anda dan verifikasi apakah itu cocok dengan nilai yang diharapkan.  
**challengeResult**  
Atur ke `true` jika pengguna berhasil menyelesaikan tantangan, atau `false` untuk sebaliknya.  
**challengeMetadata**  
Nama Anda untuk tantangan kustom. Digunakan hanya jika `challengeName` adalah `CUSTOM_CHALLENGE`.

**clientMetadata**  
Satu atau lebih pasangan nilai-kunci yang dapat Anda berikan sebagai masukan kustom ke fungsi Lambda yang Anda tentukan untuk pemicu menentukan tantangan autentikasi. Untuk meneruskan data ini ke fungsi Lambda Anda, Anda dapat menggunakan `ClientMetadata` parameter dalam operasi [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)dan [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)API. Permintaan yang memanggil fungsi define auth challenge tidak menyertakan data yang diteruskan dalam ClientMetadata parameter [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)dan operasi [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)API.

### Tentukan parameter respons tantangan Auth
<a name="cognito-user-pools-lambda-trigger-syntax-define-auth-challenge-response"></a>

Dalam respons, Anda dapat mengembalikan tahap berikutnya dari proses autentikasi.

**challengeName**  
String yang berisi nama tantangan berikutnya. Jika Anda ingin menyajikan tantangan baru bagi pengguna Anda, tentukan nama tantangan di sini.

**issueTokens**  
Jika Anda menentukan bahwa pengguna telah menyelesaikan tantangan otentikasi dengan cukup, atur ke`true`. Jika pengguna belum cukup memenuhi tantangan, atur ke`false`.

**failAuthentication**  
Jika Anda ingin mengakhiri proses otentikasi saat ini, atur ke`true`. Untuk melanjutkan proses otentikasi saat ini, atur ke`false`.

## Tentukan contoh tantangan Auth
<a name="aws-lambda-triggers-define-auth-challenge-example"></a>

Contoh ini mendefinisikan serangkaian tantangan untuk otentikasi dan mengeluarkan token hanya jika pengguna telah menyelesaikan semua tantangan dengan sukses. Saat pengguna menyelesaikan otentikasi SRP dengan `SRP_A` dan `PASSWORD_VERIFIER` tantangan, fungsi ini memberi mereka a `CUSTOM_CHALLENGE` yang memanggil pemicu tantangan create auth. Dalam kombinasi dengan [contoh tantangan create auth](user-pool-lambda-create-auth-challenge.md#aws-lambda-triggers-create-auth-challenge-example) kami, urutan ini memberikan tantangan CAPTCHA untuk tantangan tiga dan pertanyaan keamanan untuk tantangan empat.

Setelah pengguna memecahkan CAPTCHA dan menjawab pertanyaan keamanan, fungsi ini mengonfirmasi bahwa kumpulan pengguna Anda dapat mengeluarkan token. Otentikasi SRP tidak diperlukan; Anda juga dapat mengatur CAPTCHA dan pertanyaan keamanan sebagai tantangan satu & dua. Dalam kasus di mana fungsi tantangan autentikasi definisi Anda tidak menyatakan tantangan SRP, keberhasilan pengguna Anda ditentukan sepenuhnya oleh tanggapan mereka terhadap permintaan khusus Anda.

------
#### [ Node.js ]

```
const handler = async (event) => {
  if (
    event.request.session.length === 1 &&
    event.request.session[0].challengeName === "SRP_A"
  ) {
    event.response.issueTokens = false;
    event.response.failAuthentication = false;
    event.response.challengeName = "PASSWORD_VERIFIER";
  } else if (
    event.request.session.length === 2 &&
    event.request.session[1].challengeName === "PASSWORD_VERIFIER" &&
    event.request.session[1].challengeResult === true
  ) {
    event.response.issueTokens = false;
    event.response.failAuthentication = false;
    event.response.challengeName = "CUSTOM_CHALLENGE";
  } else if (
    event.request.session.length === 3 &&
    event.request.session[2].challengeName === "CUSTOM_CHALLENGE" &&
    event.request.session[2].challengeResult === true
  ) {
    event.response.issueTokens = false;
    event.response.failAuthentication = false;
    event.response.challengeName = "CUSTOM_CHALLENGE";
  } else if (
    event.request.session.length === 4 &&
    event.request.session[3].challengeName === "CUSTOM_CHALLENGE" &&
    event.request.session[3].challengeResult === true
  ) {
    event.response.issueTokens = true;
    event.response.failAuthentication = false;
  } else {
    event.response.issueTokens = false;
    event.response.failAuthentication = true;
  }

  return event;
};

export { handler };
```

------

# Buat tantangan Auth pemicu Lambda
<a name="user-pool-lambda-create-auth-challenge"></a>

Pemicu tantangan autentikasi buat adalah fungsi Lambda yang memiliki detail setiap tantangan yang dideklarasikan oleh pemicu tantangan autentikasi definisi. Ini memproses nama tantangan yang dideklarasikan oleh pemicu tantangan define auth dan mengembalikan `publicChallengeParameters` yang harus disajikan aplikasi Anda kepada pengguna. Fungsi ini kemudian menyediakan kumpulan pengguna Anda dengan jawaban atas tantangan,`privateChallengeParameters`, bahwa kumpulan pengguna Anda diteruskan ke pemicu tantangan verifikasi autentikasi. Di mana pemicu tantangan autentikasi definisi Anda mengelola urutan tantangan, pemicu tantangan autentikasi buat Anda mengelola konten tantangan.

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


**Membuat tantangan autentikasi**  
Amazon Cognito memanggil pemicu ini setelah **Menentukan Tantangan Autentikasi** jika tantangan kustom telah ditetapkan sebagai bagian dari pemicu **Menentukan Tantangan Autentikasi**. Ini menciptakan [alur autentikasi kustom](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html#amazon-cognito-user-pools-custom-authentication-flow).

Pemicu Lambda ini dipanggil untuk membuat tantangan untuk disajikan kepada pengguna. Permintaan untuk pemicu Lambda ini mencakup `challengeName` dan `session`. `challengeName` adalah string dan merupakan nama dari tantangan berikutnya untuk pengguna. Nilai dari atribut ini diatur dalam pemicu Lambda Menentukan Tantangan Autentikasi.

Putaran tantangan akan berulang sampai semua tantangan terjawab.

**Topics**
+ [Buat parameter pemicu Lambda tantangan Auth](#cognito-user-pools-lambda-trigger-syntax-create-auth-challenge)
+ [Buat contoh tantangan Auth](#aws-lambda-triggers-create-auth-challenge-example)

## Buat parameter pemicu Lambda tantangan Auth
<a name="cognito-user-pools-lambda-trigger-syntax-create-auth-challenge"></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 ]

```
{
    "request": {
        "userAttributes": {
            "string": "string",
            . . .
        },
        "challengeName": "string",
        "session": [
            ChallengeResult,
            . . .
        ],
        "clientMetadata": {
            "string": "string",
            . . .
        },
        "userNotFound": boolean
    },
    "response": {
        "publicChallengeParameters": {
            "string": "string",
            . . .
        },
        "privateChallengeParameters": {
            "string": "string",
            . . .
        },
        "challengeMetadata": "string"
    }
}
```

------

### Buat parameter permintaan tantangan Auth
<a name="cognito-user-pools-lambda-trigger-syntax-create-auth-challenge-request"></a>

**userAttributes**  
Satu atau lebih pasangan nilai-nama yang mewakili atribut pengguna.

**userNotFound**  
Boolean ini diisi ketika `PreventUserExistenceErrors` diatur ke `ENABLED` untuk klien Kolam Pengguna Anda.

**challengeName**  
Nama tantangan baru.

**sesi**  
Elemen sesi adalah array elemen `ChallengeResult`, yang masing-masing berisi elemen berikut:    
**challengeName**  
Tipe tantangan. Salah satu dari: `"CUSTOM_CHALLENGE"``"PASSWORD_VERIFIER"`,`"SMS_MFA"`,,`"DEVICE_SRP_AUTH"`,`"DEVICE_PASSWORD_VERIFIER"`,`"NEW_PASSWORD_REQUIRED"`, atau`"ADMIN_NO_SRP_AUTH"`.   
**challengeResult**  
Atur ke `true` jika pengguna berhasil menyelesaikan tantangan, atau `false` untuk sebaliknya.  
**challengeMetadata**  
Nama Anda untuk tantangan kustom. Digunakan hanya jika `challengeName` adalah `"CUSTOM_CHALLENGE"`.

**clientMetadata**  
Satu atau lebih pasangan nilai-kunci yang dapat Anda berikan sebagai masukan kustom ke fungsi Lambda yang Anda tentukan untuk membuat pemicu tantangan autentikasi. Anda dapat menggunakan ClientMetadata parameter dalam tindakan [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)dan [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)API untuk meneruskan data ini ke fungsi Lambda Anda. Permintaan yang memanggil fungsi create auth challenge tidak menyertakan data yang diteruskan dalam ClientMetadata parameter [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)dan operasi [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)API.

### Buat parameter respons tantangan Auth
<a name="cognito-user-pools-lambda-trigger-syntax-create-auth-challenge-response"></a>

**publicChallengeParameters**  
Satu atau lebih pasangan nilai-kunci untuk digunakan oleh aplikasi klien dalam tantangan yang akan disajikan kepada pengguna. Parameter ini harus berisi semua informasi yang diperlukan untuk menyajikan tantangan kepada pengguna secara akurat.

**privateChallengeParameters**  
Parameter ini hanya digunakan oleh pemicu Lambda Memverifikasi Respons Tantangan Autentikasi. Parameter ini harus berisi semua informasi yang diperlukan untuk memvalidasi respons pengguna terhadap tantangan. Dengan kata lain, parameter `publicChallengeParameters` berisi pertanyaan yang disajikan kepada pengguna dan `privateChallengeParameters` berisi jawaban yang valid untuk pertanyaan tersebut.

**challengeMetadata**  
Nama Anda untuk tantangan kustom, jika ini adalah tantangan kustom.

## Buat contoh tantangan Auth
<a name="aws-lambda-triggers-create-auth-challenge-example"></a>

Fungsi ini memiliki dua tantangan khusus yang sesuai dengan urutan tantangan dalam [contoh tantangan autentikasi definisi](user-pool-lambda-define-auth-challenge.md#aws-lambda-triggers-define-auth-challenge-example) kami. Dua tantangan pertama adalah otentikasi SRP. Untuk tantangan ketiga, fungsi ini mengembalikan URL CAPTCHA ke aplikasi Anda dalam respons tantangan. Aplikasi Anda merender CAPTCHA di URL yang diberikan dan mengembalikan input pengguna. URL untuk gambar CAPTCHA ditambahkan ke parameter tantangan publik sebagai “`captchaUrl`”, dan jawaban yang diharapkan ditambahkan ke parameter tantangan privat.

Untuk tantangan keempat, fungsi ini mengembalikan pertanyaan keamanan. Aplikasi Anda membuat pertanyaan dan meminta pengguna untuk jawabannya. Setelah pengguna menyelesaikan kedua tantangan khusus, pemicu tantangan autentikasi define mengonfirmasi bahwa kumpulan pengguna Anda dapat mengeluarkan token.

------
#### [ Node.js ]

```
const handler = async (event) => {
  if (event.request.challengeName !== "CUSTOM_CHALLENGE") {
    return event;
  }

  if (event.request.session.length === 2) {
    event.response.publicChallengeParameters = {};
    event.response.privateChallengeParameters = {};
    event.response.publicChallengeParameters.captchaUrl = "url/123.jpg";
    event.response.privateChallengeParameters.answer = "5";
  }

  if (event.request.session.length === 3) {
    event.response.publicChallengeParameters = {};
    event.response.privateChallengeParameters = {};
    event.response.publicChallengeParameters.securityQuestion =
      "Who is your favorite team mascot?";
    event.response.privateChallengeParameters.answer = "Peccy";
  }

  return event;
};

export { handler };
```

------

# Verifikasi respons tantangan Auth Pemicu Lambda
<a name="user-pool-lambda-verify-auth-challenge-response"></a>

Pemicu tantangan verifikasi autentikasi adalah fungsi Lambda yang membandingkan respons yang diberikan pengguna dengan jawaban yang diketahui. Fungsi ini memberi tahu kumpulan pengguna Anda apakah pengguna menjawab tantangan dengan benar. Saat pemicu tantangan verifikasi autentikasi merespons dengan `answerCorrect` of`true`, urutan otentikasi dapat dilanjutkan.

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


**Memverifikasi respons tantangan autentikasi**  
Amazon Cognito memanggil pemicu ini untuk memverifikasi apakah respons dari pengguna untuk Tantangan Auth khusus valid atau tidak. Ini adalah bagian dari kolam pengguna [alur autentikasi kustom](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html#amazon-cognito-user-pools-custom-authentication-flow).

Permintaan untuk pemicu ini berisi parameter `privateChallengeParameters` dan `challengeAnswer`. Pemicu Create Auth Challenge Lambda `privateChallengeParameters` mengembalikan nilai, dan berisi respons yang diharapkan dari pengguna. Parameter `challengeAnswer` berisi respons pengguna untuk tantangan.

Respons berisi `answerCorrect` atribut. Jika pengguna berhasil menyelesaikan tantangan, Amazon Cognito menetapkan nilai atribut ke. `true` Jika pengguna tidak berhasil menyelesaikan tantangan, Amazon Cognito menetapkan nilainya. `false`

Loop tantangan berulang sampai pengguna menjawab semua tantangan.

**Topics**
+ [Verifikasi parameter pemicu Lambda tantangan Auth](#cognito-user-pools-lambda-trigger-syntax-verify-auth-challenge)
+ [Verifikasi contoh respons tantangan Auth](#aws-lambda-triggers-verify-auth-challenge-response-example)

## Verifikasi parameter pemicu Lambda tantangan Auth
<a name="cognito-user-pools-lambda-trigger-syntax-verify-auth-challenge"></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 ]

```
{
    "request": {
        "userAttributes": {
            "string": "string",
            . . .
        },
        "privateChallengeParameters": {
            "string": "string",
            . . .
        },
        "challengeAnswer": "string",
        "clientMetadata": {
            "string": "string",
            . . .
        },
        "userNotFound": boolean
    },
    "response": {
        "answerCorrect": boolean
    }
}
```

------

### Verifikasi parameter permintaan tantangan Auth
<a name="cognito-user-pools-lambda-trigger-syntax-verify-auth-challenge-request"></a>

**userAttributes**  
Parameter ini berisi satu atau lebih pasangan nama-nilai yang mewakili atribut pengguna.

**userNotFound**  
Saat Amazon Cognito disetel `PreventUserExistenceErrors` `ENABLED` untuk klien kumpulan pengguna Anda, Amazon Cognito mengisi Boolean ini.

**privateChallengeParameters**  
Parameter ini berasal dari pemicu Create Auth Challenge. **Untuk menentukan apakah pengguna melewati tantangan, Amazon Cognito membandingkan parameter dengan ChallengeAnswer pengguna.**  
Parameter ini berisi semua informasi yang diperlukan untuk memvalidasi respons pengguna terhadap tantangan. Informasi itu mencakup pertanyaan yang disajikan Amazon Cognito kepada pengguna (`publicChallengeParameters`), dan jawaban yang valid untuk pertanyaan (`privateChallengeParameters`). Hanya pemicu Lambda Verify Auth Challenge Response yang menggunakan parameter ini. 

**challengeAnswer**  
Nilai parameter ini adalah jawaban dari respons pengguna terhadap tantangan.

**clientMetadata**  
Parameter ini berisi satu atau beberapa pasangan nilai kunci yang dapat Anda berikan sebagai input khusus ke fungsi Lambda untuk pemicu tantangan verifikasi autentikasi. Untuk meneruskan data ini ke fungsi Lambda Anda, gunakan ClientMetadata parameter dalam operasi [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)dan [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)API. Amazon Cognito tidak menyertakan data dari ClientMetadata parameter dalam [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)dan operasi [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)API dalam permintaan yang diteruskan ke fungsi tantangan verifikasi autentikasi.

### Verifikasi parameter respons tantangan Auth
<a name="cognito-user-pools-lambda-trigger-syntax-verify-auth-challenge-response"></a>

**answerCorrect**  
Jika pengguna berhasil menyelesaikan tantangan, Amazon Cognito menetapkan parameter ini ke. `true` Jika pengguna tidak berhasil menyelesaikan tantangan, Amazon Cognito akan menyetel parameternya. `false` 

## Verifikasi contoh respons tantangan Auth
<a name="aws-lambda-triggers-verify-auth-challenge-response-example"></a>

Fungsi verifikasi tantangan autentikasi ini memeriksa apakah respons pengguna terhadap tantangan cocok dengan respons yang diharapkan. Jawaban pengguna ditentukan oleh masukan dari aplikasi Anda dan jawaban yang disukai ditentukan oleh `privateChallengeParameters.answer` respons dari [respons pemicu tantangan create auth](user-pool-lambda-create-auth-challenge.md#aws-lambda-triggers-create-auth-challenge-example). Jawaban yang benar dan jawaban yang diberikan adalah bagian dari peristiwa input untuk fungsi ini.

Dalam contoh ini, jika respons pengguna cocok dengan respons yang diharapkan, Amazon Cognito akan menyetel `answerCorrect` parameternya. `true`

------
#### [ Node.js ]

```
const handler = async (event) => {
  if (
    event.request.privateChallengeParameters.answer ===
    event.request.challengeAnswer
  ) {
    event.response.answerCorrect = true;
  } else {
    event.response.answerCorrect = false;
  }

  return event;
};

export { handler };
```

------