

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

# Klaim pengguna lulus dan verifikasi tanda tangan di Akses Terverifikasi
<a name="user-claims-passing"></a>

Setelah Akses Terverifikasi AWS instans berhasil mengautentikasi pengguna, instans mengirimkan klaim pengguna yang diterima dari iDP ke titik akhir Akses Terverifikasi. Klaim pengguna ditandatangani sehingga aplikasi dapat memverifikasi tanda tangan dan juga memverifikasi bahwa klaim dikirim oleh Akses Terverifikasi. Selama proses ini, header HTTP berikut ditambahkan:

`x-amzn-ava-user-context`

Header ini berisi klaim pengguna dalam format token web JSON (JWT). Format JWT mencakup header, payload, dan tanda tangan yang dikodekan URL base64. Akses Terverifikasi menggunakan ES384 (algoritma tanda tangan ECDSA menggunakan algoritma hash SHA-384) untuk menghasilkan tanda tangan JWT.

Aplikasi dapat menggunakan klaim ini untuk personalisasi atau pengalaman khusus pengguna lainnya. Pengembang aplikasi harus mendidik diri mereka sendiri mengenai tingkat keunikan dan verifikasi setiap klaim yang diberikan oleh penyedia identitas sebelum digunakan. Secara umum, `sub` klaim adalah cara terbaik untuk mengidentifikasi pengguna tertentu.

**Topics**
+ [JWT untuk klaim pengguna OIDC](#oidc-sample)
+ [Klaim pengguna JWT untuk IAM Identity Center](#IdC-sample)
+ [Kunci publik](#public-keys)
+ [Mengambil dan mendekode JWT](#sample-code)

## Contoh: Menandatangani JWT untuk klaim pengguna OIDC
<a name="oidc-sample"></a>

Contoh berikut menunjukkan seperti apa header dan payload untuk klaim pengguna OIDC dalam format JWT.

Contoh header:

```
{
   "alg": "ES384",
   "kid": "12345678-1234-1234-1234-123456789012",
   "signer": "arn:aws:ec2:us-east-1:123456789012:verified-access-instance/vai-abc123xzy321a2b3c", 
   "iss": "OIDC Issuer URL",
   "exp": "expiration" (120 secs)
}
```

Contoh muatan:

```
{
   "sub": "xyzsubject",
   "email": "xxx@amazon.com",
   "email_verified": true,
   "groups": [
      "Engineering",
      "finance"
   ],
   "additional_user_context": {
      "aud": "xxx",
      "exp": 1000000000,
      "groups": [
         "group-id-1",
         "group-id-2"
      ],
      "iat": 1000000000,
      "iss": "https://oidc-tp.com/",
      "sub": "xyzsubject",
      "ver": "1.0"
   }
}
```

## Contoh: Menandatangani JWT untuk klaim pengguna IAM Identity Center
<a name="IdC-sample"></a>

Contoh berikut menunjukkan seperti apa header dan payload untuk klaim pengguna IAM Identity Center dalam format JWT.

**catatan**  
Untuk IAM Identity Center, hanya informasi pengguna yang akan dimasukkan dalam klaim.

Contoh header:

```
{
   "alg": "ES384",
   "kid": "12345678-1234-1234-1234-123456789012",
   "signer": "arn:aws:ec2:us-east-1:123456789012:verified-access-instance/vai-abc123xzy321a2b3c", 
   "iss": "arn:aws:ec2:us-east-1:123456789012:verified-access-trust-provider/vatp-abc123xzy321a2b3c",
   "exp": "expiration" (120 secs)
}
```

Contoh muatan:

```
{
    "user": {
        "user_id": "f478d4c8-a001-7064-6ea6-12423523",
        "user_name": "test-123",
        "email": {
            "address": "test@amazon.com",
            "verified": false
        }
    }
}
```

## Kunci publik
<a name="public-keys"></a>

Karena instans Akses Terverifikasi tidak mengenkripsi klaim pengguna, sebaiknya Anda mengonfigurasi titik akhir Akses Terverifikasi untuk menggunakan HTTPS. Jika Anda mengonfigurasi titik akhir Akses Terverifikasi untuk menggunakan HTTP, pastikan untuk membatasi lalu lintas ke titik akhir menggunakan grup keamanan.

Untuk memastikan keamanan, Anda harus memverifikasi tanda tangan sebelum melakukan otorisasi berdasarkan klaim, dan memvalidasi bahwa `signer` bidang di header JWT berisi ARN instance Akses Terverifikasi yang diharapkan.

Untuk mendapatkan kunci publik, dapatkan ID kunci dari header JWT dan gunakan untuk mencari kunci publik dari titik akhir.

Titik akhir untuk masing-masing Wilayah AWS adalah sebagai berikut:

`https://public-keys.prod.verified-access.<region>.amazonaws.com/<key-id>`

## Contoh: Mengambil dan mendekode JWT
<a name="sample-code"></a>

Contoh kode berikut menunjukkan cara mendapatkan ID kunci, kunci publik, dan payload di Python 3.9.

```
import jwt
import requests
import base64
import json

# Step 1: Validate the signer
expected_verified_access_instance_arn = 'arn:aws:ec2:region-code:account-id:verified-access-instance/verified-access-instance-id'

encoded_jwt = headers.dict['x-amzn-ava-user-context']
jwt_headers = encoded_jwt.split('.')[0]
decoded_jwt_headers = base64.b64decode(jwt_headers)
decoded_jwt_headers = decoded_jwt_headers.decode("utf-8")
decoded_json = json.loads(decoded_jwt_headers)
received_verified_access_instance_arn = decoded_json['signer']

assert expected_verified_access_instance_arn == received_verified_access_instance_arn, "Invalid Signer"

# Step 2: Get the key id from JWT headers (the kid field)
kid = decoded_json['kid']

# Step 3: Get the public key from regional endpoint
url = 'https://public-keys.prod.verified-access.' + region + '.amazonaws.com/' + kid
req = requests.get(url)
pub_key = req.text

# Step 4: Get the payload
payload = jwt.decode(encoded_jwt, pub_key, algorithms=['ES384'])
```