

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

# 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 };
```

------