

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

# Memverifikasi token web JSON
<a name="amazon-cognito-user-pools-using-tokens-verifying-a-jwt"></a>

Token web JSON (JWTs) dapat diterjemahkan, dibaca, dan dimodifikasi dengan mudah. Token akses yang dimodifikasi menciptakan risiko eskalasi hak istimewa. Token ID yang dimodifikasi menciptakan risiko peniruan identitas. Aplikasi Anda mempercayai kumpulan pengguna Anda sebagai penerbit token, tetapi bagaimana jika pengguna mencegat token dalam perjalanan? Anda harus memastikan bahwa aplikasi Anda menerima token yang sama dengan yang dikeluarkan Amazon Cognito.

Amazon Cognito mengeluarkan token yang menggunakan beberapa fitur integritas dan kerahasiaan spesifikasi OpenID Connect (OIDC). Token kumpulan pengguna menunjukkan validitas dengan objek seperti waktu kedaluwarsa, penerbit, dan tanda tangan digital. Tanda tangan, segmen ketiga dan terakhir dari JWT `.` yang dibatasi, adalah komponen kunci dari validasi token. Pengguna jahat dapat memodifikasi token, tetapi jika aplikasi Anda mengambil kunci publik dan membandingkan tanda tangan, itu tidak akan cocok. Setiap aplikasi yang memproses JWTs dari otentikasi OIDC harus melakukan operasi verifikasi ini dengan setiap login.

Pada halaman ini, kami membuat beberapa rekomendasi umum dan spesifik untuk verifikasi JWTs. Pengembangan aplikasi mencakup berbagai bahasa dan platform pemrograman. Karena Amazon Cognito mengimplementasikan OIDC cukup dekat dengan spesifikasi publik, pustaka JWT yang memiliki reputasi baik di lingkungan pengembang pilihan Anda dapat menangani persyaratan verifikasi Anda.

Langkah-langkah ini menjelaskan memverifikasi kolam pengguna JSON Web Token (JWT).

**Topics**
+ [Prasyarat](#amazon-cognito-user-pools-using-tokens-prerequisites)
+ [Validasi token dengan aws-jwt-verify](#amazon-cognito-user-pools-using-tokens-aws-jwt-verify)
+ [Memahami dan memeriksa token](#amazon-cognito-user-pools-using-tokens-manually-inspect)

## Prasyarat
<a name="amazon-cognito-user-pools-using-tokens-prerequisites"></a>

Pustaka, SDK, atau kerangka kerja perangkat lunak Anda mungkin sudah menangani tugas di bagian ini. AWS SDKs menyediakan alat untuk penanganan dan pengelolaan token kumpulan pengguna Amazon Cognito di aplikasi Anda. AWS Amplify termasuk fungsi untuk mengambil dan menyegarkan token Amazon Cognito.

Untuk informasi lebih lanjut, lihat halaman berikut.
+ [Mengintegrasikan otentikasi dan otorisasi Amazon Cognito dengan aplikasi web dan seluler](cognito-integrate-apps.md)
+ [Contoh kode untuk Penyedia Identitas Amazon Cognito menggunakan AWS SDKs](https://docs.aws.amazon.com/cognito/latest/developerguide/service_code_examples.html)
+ [Alur kerja lanjutan](https://docs.amplify.aws/lib/auth/advanced/q/platform/js/#retrieve-jwt-tokens) di *Amplify Dev Center*

Banyak perpustakaan tersedia untuk decoding dan verifikasi JSON Web Token (JWT). Jika Anda ingin memproses token secara manual untuk pemrosesan API sisi server, atau jika Anda menggunakan bahasa pemrograman lain, pustaka ini dapat membantu. Lihat [daftar pustaka dasar OpenID untuk bekerja dengan](http://openid.net/developers/jwt/) token JWT.

## Validasi token dengan aws-jwt-verify
<a name="amazon-cognito-user-pools-using-tokens-aws-jwt-verify"></a>

Di aplikasi Node.js, AWS rekomendasikan [aws-jwt-verifylibrary](https://github.com/awslabs/aws-jwt-verify) untuk memvalidasi parameter dalam token yang diteruskan pengguna ke aplikasi Anda. Dengan`aws-jwt-verify`, Anda dapat mengisi `CognitoJwtVerifier` dengan nilai klaim yang ingin Anda verifikasi untuk satu atau beberapa kumpulan pengguna. Beberapa nilai yang dapat diperiksa termasuk yang berikut ini.
+ Akses atau token ID itu tidak cacat atau kedaluwarsa, dan memiliki tanda tangan yang valid.
+ Token akses itu berasal dari [kumpulan pengguna dan klien aplikasi yang benar](https://github.com/awslabs/aws-jwt-verify#verifying-jwts-from-amazon-cognito).
+ Klaim token akses itu berisi [cakupan OAuth 2.0 yang benar](https://github.com/awslabs/aws-jwt-verify#checking-scope).
+ Bahwa kunci yang menandatangani akses dan token ID Anda [cocok dengan kunci penandatanganan `kid` dari *URI JWKS kumpulan* pengguna Anda](https://github.com/awslabs/aws-jwt-verify#the-jwks-cache).

  URI JWKS berisi informasi publik tentang kunci pribadi yang menandatangani token pengguna Anda. Anda dapat menemukan URI JWKS untuk kumpulan pengguna Anda di. `https://cognito-idp.<Region>.amazonaws.com/<userPoolId>/.well-known/jwks.json`

Untuk informasi selengkapnya dan contoh kode yang dapat Anda gunakan di aplikasi Node.js atau AWS Lambda otorisasi, lihat [https://github.com/awslabs/aws-jwt-verify](https://github.com/awslabs/aws-jwt-verify)di GitHub.

## Memahami dan memeriksa token
<a name="amazon-cognito-user-pools-using-tokens-manually-inspect"></a>

Sebelum mengintegrasikan pemeriksaan token dengan aplikasi, pertimbangkan cara Amazon Cognito merakit. JWTs Ambil contoh token dari kumpulan pengguna Anda. Mendekode dan memeriksa mereka secara rinci untuk memahami karakteristik mereka, dan menentukan apa yang ingin Anda verifikasi dan kapan. Misalnya, Anda mungkin ingin memeriksa keanggotaan grup dalam satu skenario, dan cakupan di skenario lain.

Bagian berikut menjelaskan proses untuk memeriksa Amazon JWTs Cognito secara manual saat Anda menyiapkan aplikasi.

### Konfirmasikan struktur JWT
<a name="amazon-cognito-user-pools-using-tokens-step-1"></a>

JSON Web Token (JWT) mencakup tiga bagian dengan pembatas `.` (titik) di antara mereka.

**Header**  
ID kunci,`kid`, dan algoritma RSA,`alg`, yang digunakan Amazon Cognito untuk menandatangani token. Amazon Cognito menandatangani token dengan dari`alg`. `RS256` `kid`Ini adalah referensi terpotong ke kunci penandatanganan pribadi RSA 2048-bit yang dipegang oleh kumpulan pengguna Anda.

**Payload**  
Klaim token. Dalam token ID, klaim mencakup atribut pengguna dan informasi tentang kumpulan pengguna`iss`, dan klien aplikasi,`aud`. Dalam token akses, payload mencakup cakupan, keanggotaan grup, kumpulan pengguna sebagai`iss`, dan klien aplikasi Anda sebagai. `client_id`

**Tanda tangan**  
Tanda tangan tidak dapat didekodekan base64url seperti header dan payload. Ini adalah RSA256 pengenal yang berasal dari kunci penandatanganan dan parameter yang dapat Anda amati di URI JWKS Anda.

Header dan payload adalah JSON yang disandikan base64url. Anda dapat mengidentifikasi mereka dengan karakter pembuka `eyJ` yang memecahkan kode ke karakter `{` awal. Jika pengguna Anda menyajikan JWT yang disandikan base64url ke aplikasi Anda dan tidak dalam format`[JSON Header].[JSON Payload].[Signature]`, itu bukan token Amazon Cognito yang valid dan Anda dapat membuangnya.

Contoh aplikasi berikut memverifikasi token kumpulan pengguna dengan`aws-jwt-verify`.

```
// cognito-verify.js
// Usage example: node cognito-verify.js eyJra789ghiEXAMPLE

const { CognitoJwtVerifier } = require('aws-jwt-verify');

// Replace with your Amazon Cognito user pool ID
const userPoolId = 'us-west-2_EXAMPLE';

async function verifyJWT(token) {
  try {
    const verifier = CognitoJwtVerifier.create({
      userPoolId,
      tokenUse: 'access', // or 'id' for ID tokens
      clientId: '1example23456789', // Optional, only if you need to verify the token audience
    });

    const payload = await verifier.verify(token);
    console.log('Decoded JWT:', payload);
  } catch (err) {
    console.error('Error verifying JWT:', err);
  }
}

// Example usage
if (process.argv.length < 3) {
  console.error('Please provide a JWT token as an argument.');
  process.exit(1);
}

const MyToken = process.argv[2];
verifyJWT(MyToken);
```

### Validasi JWT
<a name="amazon-cognito-user-pools-using-tokens-step-2"></a>

Tanda tangan JWT adalah kombinasi hash dari header dan muatan. Amazon Cognito menghasilkan dua pasang kunci kriptografi RSA untuk setiap kolam pengguna. Satu kunci pribadi menandatangani token akses, dan yang lainnya menandatangani token ID.

**Untuk memverifikasi tanda tangan dari token JWT**

1. Decode ID token.

   OpenID Foundation juga [mempertahankan daftar perpustakaan untuk bekerja dengan token JWT](http://openid.net/developers/jwt/).

   Anda juga dapat menggunakan AWS Lambda untuk memecahkan kode kumpulan JWTs pengguna. Untuk informasi selengkapnya, lihat [Mendekode dan memverifikasi token Amazon Cognito JWT](https://github.com/awslabs/aws-support-tools/tree/master/Cognito/decode-verify-jwt) menggunakan. AWS Lambda

1. Bandingkan ID kunci lokal (`kid`) dengan publik`kid`.

   1. Unduh dan simpan JSON Web Key (JWK) publik yang sesuai untuk kolam pengguna Anda. Ini tersedia sebagai bagian dari JSON Web Key Set (JWKS). Anda dapat menemukannya dengan membuat `jwks_uri` URI berikut untuk lingkungan Anda:

      ```
      https://cognito-idp.<Region>.amazonaws.com/<userPoolId>/.well-known/jwks.json
      ```

      Untuk informasi lebih lanjut tentang JWK dan JWK set, lihat [Kunci Web JSON (JWK)](https://tools.ietf.org/html/rfc7517).
**catatan**  
Amazon Cognito mungkin memutar kunci penandatanganan di kumpulan pengguna Anda. Sebagai praktik terbaik, cache kunci publik di aplikasi Anda, gunakan `kid` sebagai kunci cache, dan segarkan cache secara berkala. Bandingkan `kid` token yang diterima aplikasi Anda dengan cache Anda.  
Jika Anda menerima token dengan penerbit yang benar tetapi berbeda`kid`, Amazon Cognito mungkin telah memutar kunci penandatanganan. Segarkan cache dari `jwks_uri` titik akhir kumpulan pengguna Anda.

      Ini adalah file `jwks.json` sampel:

      ```
      {
      	"keys": [{
      		"kid": "1234example=",
      		"alg": "RS256",
      		"kty": "RSA",
      		"e": "AQAB",
      		"n": "1234567890",
      		"use": "sig"
      	}, {
      		"kid": "5678example=",
      		"alg": "RS256",
      		"kty": "RSA",
      		"e": "AQAB",
      		"n": "987654321",
      		"use": "sig"
      	}]
      }
      ```  
**ID Kunci (`kid`)**  
`kid`Ini adalah petunjuk yang menunjukkan kunci mana yang digunakan untuk mengamankan JSON Web Signature (JWS) dari token.  
**Algoritme (`alg`)**  
Parameter header `alg` mewakili algoritme kriptografi yang digunakan untuk mengamankan token ID. Kumpulan pengguna menggunakan algoritma RS256 kriptografi, yang merupakan tanda tangan RSA dengan SHA-256. Untuk informasi lebih lanjut tentang RSA, lihat kriptografi [RSA](https://tools.ietf.org/html/rfc3447).   
**Tipe kunci (`kty`)**  
Parameter `kty` mengidentifikasi keluarga algoritme kriptografi yang digunakan dengan kunci, seperti “RSA” dalam contoh ini.  
**Eksponen RSA (`e`)**  
Parameter `e` berisi nilai eksponen untuk kunci publik RSA. Hal ini direpresentasikan sebagai nilai base64Url UInt -encoded.  
**Modulus RSA (`n`)**  
Parameter `n` berisi modulus eksponen untuk kunci publik RSA. Hal ini direpresentasikan sebagai nilai base64Url UInt -encoded.  
**Gunakan (`use`)**  
Parameter `use` menjelaskan tujuan penggunaan kunci publik. Untuk contoh ini, nilai `use` `sig` merupakan tanda tangan.

   1. Cari JSON Web Key publik untuk `kid` yang cocok dengan JWT Anda. `kid`

### Verifikasi klaim
<a name="amazon-cognito-user-pools-using-tokens-step-3"></a>

**Untuk memverifikasi klaim JWT**

1. Dengan salah satu metode berikut, verifikasi bahwa token belum kedaluwarsa.

   1. Dekode token dan bandingkan `exp` klaim dengan waktu saat ini.

   1. Jika token akses Anda menyertakan `aws.cognito.signin.user.admin` klaim, kirim permintaan ke API seperti [GetUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUser.html). Permintaan API yang Anda [otorisasi dengan token akses](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pools-API-operations.html#user-pool-apis-auth-unauth) mengembalikan kesalahan jika token Anda telah kedaluwarsa.

   1. Tunjukkan token akses Anda dalam permintaan ke[Titik akhir UserInfo](userinfo-endpoint.md). Permintaan Anda mengembalikan kesalahan jika token Anda telah kedaluwarsa.

1. `aud`Klaim dalam token ID dan `client_id` klaim dalam token akses harus cocok dengan ID klien aplikasi yang dibuat di kumpulan pengguna Amazon Cognito.

1. Klaim penerbit (`iss`) harus sesuai dengan kolam pengguna Anda. Sebagai contoh, kolam pengguna yang dibuat di Wilayah `us-east-1` akan memiliki nilai `iss` sebagai berikut:

   `https://cognito-idp.us-east-1.amazonaws.com/<userpoolID>`.

1. Periksa klaim `token_use`. 
   + Jika Anda hanya menerima token akses dalam operasi API web Anda, nilainya harus `access`.
   + Jika Anda hanya menggunakan ID token, nilainya harus `id`.
   + Jika Anda menggunakan ID dan token akses, klaim `token_use` harus `id` atau `access`.

Anda sekarang dapat mempercayai klaim di dalam token.