

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

# Validasi klien dan audiens untuk penyedia OIDC
<a name="oidc-validation"></a>

Saat Anda menambahkan sumber identitas ke penyimpanan kebijakan, Izin Terverifikasi memiliki opsi konfigurasi yang memverifikasi bahwa ID dan token akses digunakan sebagaimana dimaksud. Validasi ini terjadi dalam pemrosesan permintaan `IsAuthorizedWithToken` dan `BatchIsAuthorizedWithToken` API. Perilaku berbeda antara ID dan token akses, dan antara Amazon Cognito dan sumber identitas OIDC. Dengan penyedia kumpulan pengguna Amazon Cognito, Izin Terverifikasi dapat memvalidasi ID klien di ID dan token akses. Dengan penyedia OIDC, Izin Terverifikasi dapat memvalidasi ID klien dalam token ID, dan audiens dalam token akses.

*ID klien* adalah pengidentifikasi yang terkait dengan instance penyedia identitas yang digunakan aplikasi Anda, misalnya`1example23456789`. *Audiens* adalah jalur URL yang terkait dengan *pihak yang mengandalkan*, atau tujuan, dari token akses, misalnya`https://mytoken.example.com`. Saat menggunakan token akses, `aud` klaim selalu dikaitkan dengan audiens.

Token ID OIDC memiliki `aud` klaim yang berisi klien IDs, seperti. `1example23456789`

Token Akses OIDC memiliki `aud` klaim yang berisi URL pemirsa untuk token, seperti`https://myapplication.example.com`, dan `client_id` klaim yang berisi klien IDs, seperti. `1example23456789`

Saat menyiapkan penyimpanan kebijakan, masukkan satu atau beberapa nilai untuk **validasi Audiens** yang digunakan oleh kebijakan Anda untuk memvalidasi pemirsa token.
+ **Token ID** — Izin Terverifikasi memvalidasi ID klien dengan memeriksa bahwa setidaknya satu anggota klien IDs dalam `aud` klaim cocok dengan nilai validasi audiens.
+ **Token akses** — Izin Terverifikasi memvalidasi audiens dengan memeriksa apakah URL dalam `aud` klaim cocok dengan nilai validasi audiens. Jika tidak ada `aud` klaim, audiens dapat divalidasi menggunakan `client_id` klaim `cid` atau. Periksa dengan penyedia identitas Anda untuk klaim dan format audiens yang benar.

## Otorisasi sisi klien untuk JWTs
<a name="oidc-validation-other-idp"></a>

Anda mungkin ingin memproses token web JSON di aplikasi Anda dan meneruskan klaimnya ke Izin Terverifikasi tanpa menggunakan sumber identitas toko kebijakan. Anda dapat mengekstrak atribut entitas Anda dari JSON Web Token (JWT) dan menguraikannya menjadi Izin Terverifikasi.

Contoh ini menunjukkan bagaimana Anda dapat memanggil Izin Terverifikasi dari aplikasi menggunakan JWT.¹

```
async function authorizeUsingJwtToken(jwtToken) {
  
    const payload = await verifier.verify(jwtToken);
   
    let principalEntity = {
        entityType: "PhotoFlash::User", // the application needs to fill in the relevant user type
        entityId: payload["sub"], // the application need to use the claim that represents the user-id
    };
    let resourceEntity = {
        entityType: "PhotoFlash::Photo", //the application needs to fill in the relevant resource type
        entityId: "jane_photo_123.jpg", // the application needs to fill in the relevant resource id
    };
    let action = {
        actionType: "PhotoFlash::Action", //the application needs to fill in the relevant action id
        actionId: "GetPhoto", //the application needs to fill in the relevant action type
    };
    let entities = {
        entityList: [],
    };
    entities.entityList.push(...getUserEntitiesFromToken(payload));
    let policyStoreId = "PSEXAMPLEabcdefg111111"; // set your own policy store id
    
    const authResult = await client
        .isAuthorized({
        policyStoreId: policyStoreId,
        principal: principalEntity,
        resource: resourceEntity,
        action: action,
        entities,
        })
        .promise();
        
    return authResult; 
  
}

function getUserEntitiesFromToken(payload) {
  let attributes = {};
  let claimsNotPassedInEntities = ['aud', 'sub', 'exp', 'jti', 'iss'];
  Object.entries(payload).forEach(([key, value]) => {
    if (claimsNotPassedInEntities.includes(key)) {
        return;
    }
    if (Array.isArray(value)) {
      var attibuteItem = [];
      value.forEach((item) => {
        attibuteItem.push({
          string: item,
        });
      });
      attributes[key] = {
        set: attibuteItem,
      };
    } else if (typeof value === 'string') {
      attributes[key] = {
        string: value,
      } 
    } else if (typeof value === 'bigint' || typeof value ==='number') {
        attributes[key] = {
            long: value,
          } 
    } else if (typeof value === 'boolean') {
        attributes[key] = {
            boolean: value,
       } 
    }

  });

  let entityItem = {
    attributes: attributes,
    identifier: {
      entityType: "PhotoFlash::User",
      entityId: payload["sub"], // the application needs to use the claim that represents the user-id
    }
  };
  return [entityItem];
}
```

¹ Contoh kode ini menggunakan [aws-jwt-verify](https://github.com/awslabs/aws-jwt-verify)pustaka untuk memverifikasi JWTs ditandatangani oleh IdPs OIDC-kompatibel.