

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

# Menghasilkan dan Menandatangani Token Pemutaran IVS
<a name="private-channels-generate-tokens"></a>

[Untuk detail tentang bekerja dengan JWT dan pustaka yang didukung untuk menandatangani token, kunjungi jwt.io.](https://jwt.io/) Pada antarmuka jwt.io, Anda harus memasukkan kunci pribadi Anda untuk menandatangani token. Kunci publik hanya diperlukan jika Anda ingin memverifikasi token.

## Skema Token
<a name="private-channels-tokens-schema"></a>

Semua JWT memiliki tiga bidang: header, payload, dan signature.
+ **Header** menentukan:
  + `alg`adalah algoritma penandatanganan. Ini adalah ES384, algoritma tanda tangan ECDSA yang menggunakan algoritma hash. SHA-384 
  + `typ`adalah jenis token, JWT.

  ```
  {
    "alg": "ES384",
    "typ": "JWT"
  }
  ```
+ **Payload** berisi data khusus untuk Amazon IVS:
  + `channel-arn`adalah referensi untuk permintaan pemutaran video.
  + `access-control-allow-origin`adalah bidang opsional yang dapat digunakan untuk membatasi pemutaran ke [asal](https://developer.mozilla.org/en-US/docs/Glossary/Origin) tertentu; yaitu, untuk membuat aliran dapat dilihat hanya dari situs web tertentu. Misalnya, Anda mungkin ingin mencegah orang menyematkan pemain di situs web lain. Secara default, pemutaran diizinkan di semua asal. (Perhatikan bahwa ini hanya membatasi klien browser; itu tidak membatasi pemutaran dari klien non-browser.) Bidang ini mungkin berisi beberapa asal, dipisahkan dengan koma. Domain wildcard diperbolehkan: setiap asal dapat memulai nama hostnya dengan\* (contoh: https://\*.amazon.com). Jika `strict-origin-enforcement` ya`true`, paling banyak 5 domain dapat ditentukan; jika tidak, tidak ada maksimum.
  + `strict-origin-enforcement`adalah bidang opsional yang dapat digunakan untuk memperkuat batasan asal yang ditentukan di `access-control-allow-origin` lapangan. Secara default, `access-control-allow-origin` pembatasan hanya berlaku untuk daftar putar multivarian. Jika `strict-origin-enforcement` diaktifkan, server akan memberlakukan persyaratan bahwa asal permintaan cocok dengan token untuk semua permintaan pemutaran (termasuk daftar putar multivariant, daftar putar varian, dan segmen). Ini berarti bahwa semua klien (termasuk klien non-browser) harus memberikan header permintaan asal yang valid dengan setiap permintaan. Gunakan `setOrigin` metode ini untuk mengatur header di SDK pemutar iOS dan Android IVS. Ini diatur secara otomatis di browser web kecuali iOS Safari. Untuk iOS Safari, Anda perlu menambahkan `crossorigin="anonymous"` ke elemen video, untuk memastikan bahwa header permintaan asal dikirim. Contoh:`<video crossorigin="anonymous"></video>`. 
  + `single-use-uuid`adalah bidang opsional yang berisi [pengidentifikasi unik universal (UUID)](https://en.wikipedia.org/wiki/Universally_unique_identifier) yang valid yang Anda hasilkan sebagai bagian dari pembuatan token. Jika Anda menambahkan bidang ini dan nilai UUID, token terkait yang Anda hasilkan tidak valid setelah digunakan untuk mengambil daftar putar multivarian dan menonton streaming. Single-use token autentikasi mempersulit pengguna jahat untuk berbagi streaming di saluran pribadi Anda dengan pemirsa lain. Perhatikan bahwa saat menggunakan `single-use-uuid` klaim, nilai maksimum untuk `exp` klaim adalah 10 menit di masa depan.
  + `viewer-id`adalah bidang opsional yang berisi ID yang digunakan untuk melacak dan merujuk ke penampil kepada siapa token diberikan. Bidang ini diperlukan untuk memungkinkan kemampuan untuk mencabut sesi menonton pemirsa di masa depan. Panjang maksimum adalah 40 karakter, dan nilainya harus memenuhi syarat sebagai string. Jangan gunakan bidang ini untuk mengidentifikasi pribadi, rahasia, atau informasi sensitif. Perhatikan bahwa saat menggunakan`viewer-id`, nilai maksimum untuk `exp` adalah 10 menit di masa depan.
  + `viewer-session-version`adalah bidang opsional yang berisi versi untuk dikaitkan dengan sesi penampil ini. Saat mencabut sesi penampil, nilai ini dapat digunakan untuk memfilter sesi pemirsa mana yang dicabut. Misalnya, menentukan stempel waktu Unix di sini akan memungkinkan pencabutan semua sesi yang dimulai sebelum waktu yang ditentukan. Nilai harus berupa integer bertanda 64-bit (Int64). Bidang ini dimaksudkan untuk disediakan (opsional) di samping`viewer-id`; ia tidak melakukan apa pun dengan sendirinya. Nilai default-nya adalah 0.
  + `maximum-resolution`memungkinkan Anda menentukan pemfilteran manifes berdasarkan resolusi untuk sesi pemirsa, berdasarkan hak penampil. Misalnya, menyetel bidang ini `HD` berarti pemirsa akan menerima resolusi kurang dari atau sama dengan`HD`.
  + `ads-opt-out`adalah bidang opsional yang memungkinkan Anda memilih pemirsa untuk tidak menerima iklan. Nilai yang diizinkan adalah `true` dan `fals` e. Nilai default saat bidang ini dikecualikan adalah`false`. Lihat [Penyisipan Server-Side Iklan](https://docs.aws.amazon.com/ivs/latest/LowLatencyUserGuide/server-side-ad-insertion.html) untuk informasi selengkapnya.
  + `ads-player-params`adalah bidang opsional yang memungkinkan Anda untuk meneruskan parameter ke Elemental MediaTailor seolah-olah itu adalah parameter pemain. Kunci yang Anda masukkan ke dalam daftar ini selalu diberi namespaced sebagai `player_params` parameter template. Ukuran muatan total untuk semua kunci dan nilai gabungan dibatasi hingga 1000 byte.
  + `exp`adalah stempel waktu Unix UTC ketika token kedaluwarsa. Ini tidak menunjukkan lamanya waktu aliran dapat dilihat. Token divalidasi saat pemirsa menginisialisasi pemutaran, bukan di seluruh aliran. Masukkan nilai ini sebagai nilai tipe integer.

    Perhatikan bahwa stempel waktu Unix adalah nilai numerik yang mewakili jumlah detik dari 1970-01-01 T00:00:00Z UTC hingga UTC yang ditentukan, mengabaikan detik kabisat. date/time Bahasa yang berbeda mengukur cap waktu Unix dalam satuan yang berbeda; misalnya, JavaScript `Date.now()` mengembalikan waktu dalam milidetik. (Lihat `exp` di [JWT RFC bagian](https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.4) 4.1.4.)

  ```
  {
      "aws:channel-arn": "<channel_arn>",
      "aws:access-control-allow-origin": "<your-origin>",
      "aws:strict-origin-enforcement": true,
      "aws:single-use-uuid": "<UUID>",
      "aws:viewer-id": "<viewer_id>",
      "aws:viewer-session-version": "<viewer_session_version>",
      "aws:maximum-resolution": "SD" | "HD" | "FULL_HD",
      "exp": <unix timestamp>
  }
  ```
+ Untuk membuat **tanda tangan**, gunakan kunci pribadi dengan algoritme yang ditentukan di header (ES384) untuk menandatangani header yang dikodekan dan muatan yang dikodekan.

  ```
  ECDSASHA384(
    base64UrlEncode(header) + "." +
    base64UrlEncode(payload),
    <private-key>
  )
  ```

## Petunjuk
<a name="private-channels-tokens-instructions"></a>

1. Buat tanda tangan token dengan algoritme penandatanganan ES384 dan kunci pribadi yang dikaitkan dengan salah satu sumber daya kunci pemutaran Anda (lihat contoh di atas). `ECDSASHA384`

1. Merakit token.

   ```
   base64UrlEncode(header) + "." +
   base64UrlEncode(payload) + "." +
   base64UrlEncode(signature)
   ```

1. Tambahkan token yang ditandatangani ke URL pemutaran sebagai parameter kueri.

   ```
   https://b37c565f6d790a14a0e78afaa6808a80.us-west-2.playback.live-video.net/
   api/video/v1/aws.ivs.us-west-2.123456789.
   channel.fbc789c1-2c56-4ce6-a30a-d99275dc4481.m3u8?token=<token>
   ```

## Node.js Contoh
<a name="private-channels-tokens-nodejs-example"></a>

Di bawah ini adalah salah satu cara untuk menghasilkan token di back end (melalui layanan mikro atau aplikasi tanpa server) menggunakan. Node.js 

```
import jwt from "jsonwebtoken";

const getToken = () => {
  const privateChannelArn = process.env.DEMO_PRIVATE_CHANNEL_ARN; // private channel ARN
  const privateChannelPrivateKey = process.env.DEMO_PRIVATE_CHANNEL_PRIVATE_KEY; // playback private key

  const payload = {
    "aws:channel-arn": privateChannelArn,
    "aws:access-control-allow-origin": "*",
    "exp": Date.now() + (60 * 1000), // expires in 1 minute
  };

  const token = jwt.sign(payload, privateChannelPrivateKey, { algorithm: 'ES384' });
  return token;
}
```

Dalam aplikasi frontend Anda, Anda dapat mengambil token ini dan menambahkannya ke URL pemutaran saluran pribadi, seperti yang ditunjukkan di bawah ini. 

```
const streamUrl = `https://b37c565f6d790a14a0e78afaa6808a80.us-west-2.playback.live-video.net/api/video/v1/aws.ivs.us-west-2.123456789.channel.fbc789c1-2c56-4ce6-a30a-d99275dc4481.m3u8?token.m3u8?token=${token}`
const ivsPlayer = IVSPlayer.create();
ivsPlayer.attachHTMLVideoElement(document.getElementById('video-player'));
ivsPlayer.load(streamUrl);
ivsPlayer.play();
```