統合 JWT 規格
このドキュメントは機械翻訳で作成された下書きであり、現在レビュー中です。機械翻訳の特性上、一部の内容が不正確であったり、韓国語の原文と異なる場合があります。より正確な情報については、韓国語のドキュメントをご参照ください。
このドキュメントは、非暗号化コンテンツ(一般コンテンツ)および Kollus DRM コンテンツの安全な再生とプレイヤー機能制御のための**統合 JWT(JSON Web Token)**の詳細規格を説明します。 単純な再生認証を超え、再生速度制限・コンテンツ公開区間設定・ウォーターマーキングなど、サービスポリシーに合わせた各種セキュリティおよび利便性機能をお客様のサーバーで直接定義できます。
JWT 技術仕様
暗号化アルゴリズム
Kollus VOD は HMAC SHA-256(HS256)アルゴリズムのみをサポートしています。
Header: { "alg": "HS256", "typ": "JWT" }
認証キー
JWT 生成および呼び出し時に以下の 2 つのキーを使用します。
-
セキュリティーキー: JWT 署名(Signing)および検証に使用される秘密鍵です。外部への漏洩にご注意ください。
- 確認方法: Kollus VOD コンソール > [設定] > [ユーザーキー]
- セキュリティーキーの変更: 営業担当者(jp_sales@catenoid.net)までお問い合わせください。
-
説明: セキュリティーキーを暗号化した値で、セキュリティーキーとともに認証(JWT)に使用されます。
- ユーザーキー: Kollus VOD コンソール > [設定] > [ユーザーキー]
- 注意事項: ブラウザのリフレッシュ時に値が更新される場合があります。使用時点の最新の値をコピーして適用してください。
リクエスト URL の形式
トークンの生成が完了したら、以下の形式のURLを使用してプレイヤーを呼び出します。
https://v.jp.kollus.com/s?jwt={JWT}&custom_key={CUSTOM_KEY}
留意事項
- iOS フルスクリーンモード: iOS 環境でフルスクリーンに切り替えると iOS Native プレイヤーが起動します。
- 機能制限環境: iOS または Samsung ブラウザでフルスクリーン再生時、ウォーターマーク表示など Kollus プレイヤー機能の動作が制限される場合があります。
- ウォーターマーキングの有効化: ウォーターマーキング(Watermarking)機能はデフォルトで無効になっています。この機能を有効化するには、営業担当者(jp_sales@catenoid.net)までお問い合わせください。
JWT Payload 詳細規格
RFC 7519 - Registered Claim Names規格の Claim を使用するとエラーが発生する場合があります。
必須オプションの適用例
ユーザー(catenoid)が特定のコンテンツ(vnCVPVyV)を再生するための基本 Payload 構造です。
{
"cuid": "catenoid",
"expt": 1703980800,
"mc": [
{
"mckey": "vnCVPVyV"
}
]
}
基本オプション
| オプション | タイプ | 必須 | デフォルト値 | 説明 |
|---|---|---|---|---|
cuid | string | ◯ | - | ユーザー ID
|
expt | integer | ◯ | - | JWT 有効期限 (Unix タイムスタンプ)
|
mc | array | ◯ | - | 再生するコンテンツ情報を含む配列 |
next_episode | boolean | - | false | 次の動画呼び出しの有無
|
playback_rates | array | - | - | ユーザーが選択可能な再生速度リスト
|
playcallback_ignore | boolean | - | false | Play Callback の送信を無視するかどうか
|
コンテンツオプション (mc 配列内の設定)
キー(Key/ID)情報については、認証および主要キードキュメントを参照してください。
| オプション | タイプ | 必須 | デフォルト値 | 説明 |
|---|---|---|---|---|
mckey | string | ◯ | - | メディアコンテンツキー |
mcpf | string | - | null | エンコーディングプロファイルキー
|
title | string | - | null | コンテンツタイトル
|
intr | boolean | - | false | イントロ/アウトロ動画かどうか
|
seek | boolean | - | true | 再生位置の移動(シーク)が可能かどうか
|
seekable_end | integer | - | -1 | シーク許可の終了時点 (秒)
|
disable_playrate | boolean | - | false | 再生速度選択機能の無効化
|
disable_nscreen | boolean | - | false | 続きから再生機能の無効化
|
scroll_event | boolean | - | false | スクロールイベントの適用有無
|
bookmark | boolean | - | true | ブックマークボタンの表示有無 |
コンテンツ公開区間の設定
Kollus VOD は原本ファイルの物理的な編集(カット、結合など)機能を提供しませんが、登録されたコンテンツの特定の区間のみをユーザーに公開するよう設定できます。
- 機能定義: 原本動画内で視聴可能な開始時点(
start_time)と終了時点(end_time)を指定して配信する機能です。 - 主な特徴
- 動画編集不可: アップロード済みの原本動画ファイル自体のカットや結合など、データレベルの物理的な編集はサポートしていません。
- 特定区間の配信が可能: 設定された区間外の動画はユーザーのプレイヤーに読み込まれず、指定された特定の部分のみがユーザーに公開されます。
- 柔軟な管理: 原本ファイルを複製したり再アップロードしたりする必要なく、設定値の変更だけで 1 つのファイルを複数の投稿として活用できます。
| オプション | タイプ | デフォルト値 | 説明 |
|---|---|---|---|
play_section.start_time | integer | null | 再生区間の開始時点 (秒) |
play_section.end_time | integer | null | 再生区間の終了時点 (秒) |
字幕設定
特定の字幕のみをフィルタリングして表示するには、show_by_filter オプションを true に設定し、filter プロパティに表示する字幕条件を指定します。
| オプション | タイプ | デフォルト値 | 説明 |
|---|---|---|---|
subtitle_policy.filter.name | string | null | 字幕フィルター - 字幕名 |
subtitle_policy.filter.language_code | string | null | 字幕フィルター - 言語コード |
subtitle_policy.filter_main.name | string | null | メイン字幕フィルター - 字幕名 |
subtitle_policy.filter_main.language_code | string | null | メイン字幕フィルター - 言語コード |
subtitle_policy.filter_sub.name | string | null | サブ字幕フィルター - 字幕名 |
subtitle_policy.filter_sub.language_code | string | null | サブ字幕フィルター - 言語コード |
subtitle_policy.show_by_filter | boolean | false | フィルター基準に基づく字幕の表示有無 |
subtitle_policy.is_showable | boolean | false | 字幕の表示有無 |
ウォーターマーキング
- 機能の有効化: ウォーターマーキング機能はデフォルトで無効になっています。この機能を有効化するには、営業担当者(jp_sales@catenoid.net)までお問い合わせください。
- 改ざん防止: 外部スクリプト(JavaScript Injection)によるウォーターマークの改ざん防止機能がデフォル トで適用されます。
画面にユーザー識別情報をオーバーレイして、不正録画および情報漏洩を防止します。
| オプション | タイプ | デフォルト値 | 説明 |
|---|---|---|---|
video_watermarking_code_policy.code_kind | string | - | ウォーターマーク表示テキスト
|
video_watermarking_code_policy.font_size | integer | 7 | ウォーターマークテキストサイズ (px) |
video_watermarking_code_policy.font_color | string | "FFFFFF" | ウォーターマークの色 (hex) |
video_watermarking_code_policy.alpha | integer | 200 | ウォーターマークの透明度 (0〜255) |
video_watermarking_code_policy.show_time | integer | 1 | ウォーターマーク表示持続時間 (秒) |
video_watermarking_code_policy.hide_time | integer | 60 | ウォーターマーク非表示持続時間 (秒) |
video_watermarking_code_policy.show_paused | boolean | false | 一時停止中のウォーターマーク表示有無 |
video_watermarking_code_policy.enable_html5_player | boolean | false | Kollus Web Player の使用有無
|
PHP 実装例
<?php
/**
* base64_urlencode
*
* @param string $str
* @return string
*/
function base64_urlencode($str) {
return rtrim(strtr(base64_encode($str), '+/', '-_'), '=');
}
/**
* jwt_encode
*
* @param array $payload
* @param string $key
* @return string
*/
function jwt_encode($payload, $key) {
$jwtHead = base64_urlencode(json_encode(array('typ' => 'JWT', 'alg' => 'HS256')));
$jsonPayload = base64_urlencode(json_encode($payload));
$signature = base64_urlencode(hash_hmac('SHA256', $jwtHead . '.' . $jsonPayload, $key, true));
return $jwtHead . '.' . $jsonPayload . '.' . $signature;
}
$securityKey = 'SECURITY_KEY';
$customKey = 'CUSTOM_KEY';
$mediaContentKey = 'MEDIA_CONTENT_KEY';
$clientUserId = 'CLIENT_USER_ID';
$expireTime = 7200; // 120 minutes
$mediaItems = array(
array(
'media_content_key' => $mediaContentKey,
),
);
$payload = array(
'mc' => array(),
'cuid' => $clientUserId,
'expt' => time() + $expireTime,
'video_watermarking_code_policy' =>
array(
'code_kind' => '2930451',
'font_size' => 20,
'font_color' => 'ffffff',
'show_time' => 10,
'hide_time' => 1,
'alpha' => 255,
'enable_html5_player' => true
),
);
foreach ($mediaItems as $mediaItem) {
$mcClaim = array();
$mcClaim['mckey'] = $mediaItem['media_content_key'];
$payload['mc'][] = $mcClaim;
}
$jwtToken = jwt_encode($payload, $securityKey);
$webTokenURL = 'https://v.jp.kollus.com/s?jwt=' . $jwtToken . '&custom_key=' . $customKey;
?>
<!DOCTYPE html>
<html lang="en">
<body>
<iframe width="840" height="472" src="<?php echo $webTokenURL; ?>" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe>
</body>
</html>