

# Generieren und Signieren von Wiedergabe-Token
<a name="private-channels-generate-tokens"></a>

Weitere Informationen zum Arbeiten mit JWTs und den unterstützten Bibliotheken zum Signieren von Token finden Sie unter [jwt.io](https://jwt.io/). In der jwt.io-Oberfläche müssen Sie Ihren privaten Schlüssel eingeben, um Token zu signieren. Der öffentliche Schlüssel wird nur benötigt, wenn Sie Token verifizieren möchten.

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

Alle JWTs haben drei Felder: Header, Nutzlast und Signatur.
+ Der **Header** gibt Folgendes an:
  + `alg` ist der Signaturalgorithmus. Dies ist ES384, ein ECDSA-Signaturalgorithmus, der den SHA-384-Hash-Algorithmus verwendet.
  + `typ` ist der Tokentyp, JWT.

  ```
  {
    "alg": "ES384",
    "typ": "JWT"
  }
  ```
+ Die **Nutzlast** enthält spezifische Daten für Amazon IVS:
  + `channel-arn` ist eine Referenz für die Videowiedergabeanforderung.
  + `access-control-allow-origin` ist ein optionales Feld, das verwendet werden kann, um die Wiedergabe auf eine bestimmte [Herkunft](https://developer.mozilla.org/en-US/docs/Glossary/Origin) zu beschränken, d. h., um einen Stream nur von einer bestimmten Website aus sichtbar zu machen. Beispielsweise können Sie verhindern, dass Benutzer den Player auf anderen Websites einbetten. Standardmäßig ist die Wiedergabe von allen Ursprüngen aus zugelassen. (Beachten Sie, dass dies nur den Browser-Client einschränkt, jedoch nicht die Wiedergabe von einem Nicht-Browser-Client.) Dieses Feld kann mehrere Ursprünge enthalten, die durch Kommas getrennt sind. Platzhalterdomänen sind erlaubt: jeder Ursprung kann seinen Hostnamen mit \$1 beginnen (Beispiel: https://\$1.amazon.com). Wenn `strict-origin-enforcement` auf `true` festgelegt ist, können maximal fünf Domänen angegeben werden. Andernfalls gibt es keinen maximalen Grenzwert.
  + `strict-origin-enforcement` ist ein optionales Feld, das verwendet werden kann, um die im `access-control-allow-origin`-Feld angegebene Herkunftsbeschränkung zu verstärken. Standardmäßig gilt die `access-control-allow-origin`-Einschränkung nur für die multivariante Wiedergabeliste. Wenn `strict-origin-enforcement` aktiviert ist, setzt der Server die Anforderung durch, dass der anfordernde Ursprung dem Token für alle Wiedergabeanforderungen entspricht (einschließlich multivarianter Wiedergabelisten, variantener Wiedergabelisten und Segmente). Das bedeutet, dass alle Clients (auch Nicht-Browser-Clients) bei jeder Anfrage einen gültigen Origin-Anforderungsheader angeben müssen. Verwenden Sie die `setOrigin`-Methode, um den Header in den iOS- und Android-Player-SDKs von IVS festzulegen. Es wird automatisch in Webbrowsern außer iOS Safari eingestellt. Für iOS Safari müssen Sie dem Videoelement `crossorigin="anonymous"` hinzufügen, um sicherzustellen, dass der Origin-Anforderungsheader gesendet wird. Beispiel: `<video crossorigin="anonymous"></video>`. 
  + `single-use-uuid` ist ein optionales Feld mit einem gültigen [Universally Unique Identifier (UUID)](https://en.wikipedia.org/wiki/Universally_unique_identifier), den Sie im Rahmen der Erstellung des Tokens generieren. Wenn Sie dieses Feld und einen UUID-Wert hinzufügen, wird das zugehörige generierte Token ungültig, sobald damit eine multivariante Wiedergabeliste abgerufen und ein Stream angesehen wird. Einweg-Authentifizierungstoken erschweren es böswilligen Benutzern, einen Stream auf Ihren privaten Kanälen mit anderen Zuschauern zu teilen. Hinweis: Bei Verwendung des `single-use-uuid`-Antrags beträgt der Höchstwert für den `exp`-Antrag 10 Minuten in der Zukunft.
  + `viewer-id` ist ein optionales Feld, das eine ID enthält, die zur Nachverfolgung verwendet wird und auf den Viewer verweist, dem das Token gewährt wird. Dieses Feld ist erforderlich, damit die Viewer-Sitzung des Viewers in Zukunft rückgängig gemacht werden kann. Die maximale Länge beträgt 40 Zeichen, und der Wert muss als Zeichenfolge gelten. Verwenden Sie dieses Feld nicht für persönlich identifizierbare, vertrauliche oder sensible Informationen. Hinweis: Bei Verwendung von `viewer-id` beträgt der Höchstwert für `exp` 10 Minuten in der Zukunft.
  + `viewer-session-version` ist ein optionales Feld, das eine Version enthält, die mit dieser Viewer-Sitzung verknüpft werden soll. Beim Widerrufen von Viewer-Sitzungen kann dieser Wert verwendet werden, um zu filtern, welche Viewer-Sitzungen gesperrt werden. Wenn Sie hier beispielsweise einen Unix-Zeitstempel angeben, können alle Sitzungen, die vor dem angegebenen Zeitpunkt gestartet wurden, widerrufen werden. Der Wert muss eine 64-Bit-Ganzzahl mit Vorzeichen (Int64) sein. Dieses Feld soll (optional) zusammen mit `viewer-id` bereitgestellt werden. Von alleine macht es nichts. Der Standardwert lautet 0.
  + Mit `maximum-resolution` können Sie die Manifestfilterung nach Auflösung für eine Zuschauersitzung auf Grundlage von Zuschauerberechtigungen angeben. Wenn Sie dieses Feld beispielsweise auf `HD` einstellen, erhält der Zuschauer eine Auflösung, die kleiner oder gleich `HD` ist.
  + `exp` ist ein Unix-UTC-Zeitstempel für den Zeitpunkt, an dem das Token abläuft. Dies gibt nicht an, wie lange der Stream angezeigt werden kann. Das Token wird überprüft, wenn der Viewer die Wiedergabe initialisiert, nicht im gesamten Stream. Geben Sie diesen Wert als Ganzzahltyp ein.

    Beachten Sie, dass ein Unix-Zeitstempel ein numerischer Wert ist, der die Anzahl der Sekunden von 1970-01-01T00:00:00Z UTC bis zum angegebenen UTC-Datum/Uhrzeit angibt, wobei Schaltsekunden ignoriert werden. Verschiedene Sprachen messen Unix-Zeitstempel in verschiedenen Einheiten; z. B. gibt JavaScripts `Date.now()` die Zeit in Millisekunden zurück. (Siehe `exp` im [Abschnitt 4.1.4 von JWT RFC](https://datatracker.ietf.org/doc/html/rfc7519#section-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>
  }
  ```
+ Zum Erstellen der **Signatur** verwenden Sie den privaten Schlüssel im Header (ES384) mit dem angegebenen Algorithmus, um den codierten Header, die codierte Nutzlast und den privaten Schlüssel zu signieren.

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

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

1. Generieren Sie die Signatur des Tokens mit dem ES384-Signaturalgorithmus und einem privaten Schlüssel, der einer Ihrer Wiedergabe-Schlüssel-Ressourcen zugeordnet ist (siehe `ECDSASHA384`-Beispiel oben).

1. Montieren des Token.

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

1. Hängen Sie das signierte Token als Abfrageparameter an die Wiedergabe-URL an.

   ```
   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-Beispiel
<a name="private-channels-tokens-nodejs-example"></a>

Nachfolgend wird eine Möglichkeit aufgezeigt, mithilfe von Node.js ein Token im Backend (über einen Microservice oder eine Serverless-Anwendung) zu generieren. 

```
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;
}
```

Dieses Token können Sie in der Frontend-Anwendung abrufen und an die Wiedergabe-URL des privaten Kanals anfügen, wie unten gezeigt. 

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