View a markdown version of this page

Menghasilkan dan Menandatangani Token Pemutaran IVS - Amazon IVS

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

Untuk detail tentang bekerja dengan JWT dan pustaka yang didukung untuk menandatangani token, kunjungi 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

Semua JWT memiliki tiga bidang: header, payload, dan signature.

  • Header menentukan:

    • algadalah algoritma penandatanganan. Ini adalah ES384, algoritma tanda tangan ECDSA yang menggunakan algoritma hash. SHA-384

    • typadalah jenis token, JWT.

    { "alg": "ES384", "typ": "JWT" }
  • Payload berisi data khusus untuk Amazon IVS:

    • channel-arnadalah referensi untuk permintaan pemutaran video.

    • access-control-allow-originadalah bidang opsional yang dapat digunakan untuk membatasi pemutaran ke asal 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 yatrue, paling banyak 5 domain dapat ditentukan; jika tidak, tidak ada maksimum.

    • strict-origin-enforcementadalah 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-uuidadalah bidang opsional yang berisi pengidentifikasi unik universal (UUID) 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-idadalah 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 menggunakanviewer-id, nilai maksimum untuk exp adalah 10 menit di masa depan.

    • viewer-session-versionadalah 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 sampingviewer-id; ia tidak melakukan apa pun dengan sendirinya. Nilai default-nya adalah 0.

    • maximum-resolutionmemungkinkan 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 denganHD.

    • ads-opt-outadalah 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 adalahfalse. Lihat Penyisipan Server-Side Iklan untuk informasi selengkapnya.

    • ads-player-paramsadalah 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.

    • expadalah 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 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

  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

  2. Merakit token.

    base64UrlEncode(header) + "." + base64UrlEncode(payload) + "." + base64UrlEncode(signature)
  3. 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

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();