概要
PlayReady Secure Stop Server には、PlayReady 実装でセキュリティで保護された停止機能を検証するためのテスト エンドポイントが用意されています。 Secure Stop を使用すると、メディア消費追跡データがクライアントからコンテンツ プロバイダーに安全に送信され、正確な使用状況の監視とコンプライアンスレポートが可能になります。
サービス エンドポイント
Secure Stop テスト サーバーは、次の場合に使用できます。
https://playready.directtaps.net/pr/svc/securestop.asmx
Secure Stop Protocol
プロトコルの概要
Secure Stop を使用すると、クライアントはセッション終了情報を安全に報告できます。
- クライアントが再生セッションを開始する
- ライセンスでセキュリティで保護された停止要件を指定する
- クライアントが再生中にセキュリティで保護された停止データを生成する
- セッション終了時に、クライアントはセキュリティで保護された停止レポートをサーバーに送信します
- サーバーが受信を検証して確認する
メッセージ フロー
Client License Server Secure Stop Server
| | |
|-- License Request -------->| |
|<-- License Response -------| |
| (with SecureStop URL) | |
| | |
| [Playback Session] | |
| | |
|-- Secure Stop Report ------|-------------------------->|
|<-- Acknowledgment ---------|---------------------------|
サーバー構成
セキュアストップの要件
ライセンス応答でセキュリティで保護された停止を構成します。
{
"licenseType": "persistent",
"keyId": "key-id-guid",
"secureStop": {
"required": true,
"serverUrl": "https://playready.directtaps.net/pr/svc/securestop.asmx",
"reportingFrequency": "session-end",
"customData": {
"sessionId": "unique-session-identifier",
"contentId": "content-identifier"
}
}
}
サーバー応答の構成
サーバーでは、テストのためのさまざまな応答モードがサポートされています。
{
"responseMode": "success|failure|timeout|partial",
"acknowledgmentDelay": 0,
"customData": {
"testScenario": "normal-operation"
}
}
API エンドポイント
Secure Stop Report を送信する
エンドポイント:POST /pr/svc/securestop.asmx/SubmitReport
要求の形式:
POST /pr/svc/securestop.asmx/SubmitReport HTTP/1.1
Host: playready.directtaps.net
Content-Type: application/octet-stream
[Secure Stop Report Data - Binary Format]
応答形式:
HTTP/1.1 200 OK
Content-Type: application/octet-stream
[Secure Stop Acknowledgment - Binary Format]
クエリ レポートの状態
エンドポイント:GET /pr/svc/securestop.asmx/QueryStatus
要求の形式:
GET /pr/svc/securestop.asmx/QueryStatus?sessionId=SESSION_ID HTTP/1.1
Host: playready.directtaps.net
応答形式:
{
"sessionId": "session-identifier",
"status": "pending|received|processed|error",
"timestamp": "2024-01-15T10:30:00Z",
"reportSize": 1024,
"processingTime": 50
}
テスト シナリオ
基本的なセキュリティで保護された停止テスト
通常の安全な停止フローをテストします。
async function testBasicSecureStop() {
// 1. Acquire license with secure stop requirement
const license = await acquireLicense({
keyId: 'test-key-id',
secureStopRequired: true,
secureStopUrl: 'https://playready.directtaps.net/pr/svc/securestop.asmx'
});
// 2. Simulate playback session
const session = await startPlaybackSession(license);
// 3. End session and generate secure stop report
const secureStopReport = await endSessionWithSecureStop(session);
// 4. Submit secure stop report
const response = await submitSecureStopReport(secureStopReport);
return response.acknowledged;
}
エラー処理テスト
テスト エラーシナリオ:
async function testSecureStopErrorHandling() {
const testCases = [
{
name: 'Invalid Report Format',
data: generateInvalidReport(),
expectedError: 'INVALID_FORMAT'
},
{
name: 'Expired Session',
data: generateExpiredSessionReport(),
expectedError: 'SESSION_EXPIRED'
},
{
name: 'Duplicate Report',
data: generateDuplicateReport(),
expectedError: 'DUPLICATE_REPORT'
}
];
const results = [];
for (const testCase of testCases) {
try {
await submitSecureStopReport(testCase.data);
results.push({ test: testCase.name, result: 'UNEXPECTED_SUCCESS' });
} catch (error) {
results.push({
test: testCase.name,
result: error.code === testCase.expectedError ? 'PASS' : 'FAIL'
});
}
}
return results;
}
パフォーマンス テスト
セキュリティで保護された停止のパフォーマンスをテストします。
async function testSecureStopPerformance() {
const concurrentReports = 10;
const reports = [];
// Generate multiple secure stop reports
for (let i = 0; i < concurrentReports; i++) {
reports.push(generateSecureStopReport(`session-${i}`));
}
// Submit reports concurrently
const startTime = Date.now();
const promises = reports.map(report => submitSecureStopReport(report));
const results = await Promise.allSettled(promises);
const endTime = Date.now();
return {
totalTime: endTime - startTime,
averageTime: (endTime - startTime) / concurrentReports,
successCount: results.filter(r => r.status === 'fulfilled').length,
errorCount: results.filter(r => r.status === 'rejected').length
};
}
クライアント統合
JavaScript の実装
class SecureStopClient {
constructor(serverUrl) {
this.serverUrl = serverUrl;
}
async submitReport(secureStopData) {
const response = await fetch(`${this.serverUrl}/SubmitReport`, {
method: 'POST',
headers: {
'Content-Type': 'application/octet-stream'
},
body: secureStopData
});
if (!response.ok) {
throw new Error(`Secure stop submission failed: ${response.status}`);
}
return await response.arrayBuffer();
}
async queryStatus(sessionId) {
const response = await fetch(`${this.serverUrl}/QueryStatus?sessionId=${sessionId}`);
if (!response.ok) {
throw new Error(`Status query failed: ${response.status}`);
}
return await response.json();
}
}
// Usage
const secureStopClient = new SecureStopClient('https://playready.directtaps.net/pr/svc/securestop.asmx');
C# の実装
public class SecureStopClient
{
private readonly HttpClient httpClient;
private readonly string serverUrl;
public SecureStopClient(string serverUrl)
{
this.serverUrl = serverUrl;
this.httpClient = new HttpClient();
}
public async Task<byte[]> SubmitReportAsync(byte[] secureStopData)
{
var content = new ByteArrayContent(secureStopData);
content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
var response = await httpClient.PostAsync($"{serverUrl}/SubmitReport", content);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsByteArrayAsync();
}
public async Task<SecureStopStatus> QueryStatusAsync(string sessionId)
{
var response = await httpClient.GetAsync($"{serverUrl}/QueryStatus?sessionId={sessionId}");
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<SecureStopStatus>(json);
}
}
データ フォーマット
セキュリティで保護された停止レポートの構造
セキュリティで保護された停止レポートには、次のものが含まれます。
- セッション識別子: 一意のセッション ID
- コンテンツ識別子: 使用されているコンテンツ
- 使用状況データ: 再生時間、品質など
- デバイス情報: クライアント デバイスの詳細
- タイムスタンプ情報: セッションの開始時刻/終了時刻
- デジタル署名: 暗号化による信頼性の証明
レポートの検証
サーバーは、次のレポートを検証します。
- 形式の整合性: 正しいバイナリ構造
- デジタル署名: 暗号化の信頼性
- セッションの有効性: 有効なセッション パラメーター
- タイムスタンプの精度: 妥当な時間値
- 重複検出: 重複する送信の防止
高度な機能
カスタム データのサポート
セキュア ストップ レポートにカスタム データを含める:
{
"customData": {
"contentProvider": "test-provider",
"userAgent": "PlayReady-Client/4.0",
"playbackQuality": "HD",
"geolocation": "US-WEST"
}
}
バッチ レポート
1 つの要求で複数のセキュリティで保護された停止レポートを送信します。
async function submitBatchReports(reports) {
const batchData = {
reports: reports,
batchId: generateBatchId(),
timestamp: new Date().toISOString()
};
const response = await fetch(`${serverUrl}/SubmitBatch`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(batchData)
});
return await response.json();
}
監視と分析
レポート分析
テスト サーバーは、分析エンドポイントを提供します。
GET /pr/svc/securestop.asmx/Analytics?period=24h
応答には次のものが含まれます。
- 受信したレポートの合計数
- 平均処理時間
- エラー率 (種類別)
- 地理的な分布
- クライアント バージョンの統計情報
正常性の監視
サーバーの正常性を監視する:
async function checkSecureStopServerHealth() {
const response = await fetch('https://playready.directtaps.net/pr/svc/securestop.asmx/Health');
return await response.json();
}
ベスト プラクティス
クライアントの実装
- Reliable Delivery: 失敗した送信の再試行ロジックを実装する
- オフライン サポート: ネットワークが使用できない場合にレポートをキューに登録する
- データの検証: 送信前にレポート データを検証する
- エラー処理: サーバー エラーを適切に処理する
- プライバシー: レポート内の機密データを保護する
推奨事項のテスト
- 包括的なシナリオ: 通常の状態とエラー状態をテストする
- パフォーマンス テスト: 読み込み条件下で検証する
- ネットワーク条件: さまざまなネットワーク シナリオでテストする
- データの整合性: レポート データの精度を確認する
- セキュリティ テスト: 暗号化コンポーネントを検証する
関連ドキュメント
- PlayReady テスト サーバー サービス - メイン サービスの概要
- サーバーのセキュリティで保護された削除 - 関連するセキュリティで保護された機能
- バージョン管理されたサーバー - サーバーのバージョン情報
- PlayReady テスト サーバー - サーバーの完全なドキュメント
サポートとトラブルシューティング
セキュリティで保護された停止機能に関する問題の場合:
- ライセンスでセキュア ストップが有効になっていることを確認する
- レポートの形式と構造を確認する
- サーバーへのネットワーク接続を検証する
- サーバーの応答でエラーの詳細を確認する
- 簡略化されたシナリオを最初に使用してテストする
一般的な問題:
- レポート形式エラー: バイナリ形式または構造が無効です
- 署名の検証: 暗号化署名の問題
- ネットワーク タイムアウト: サーバー接続の問題
- セッションの有効期限: レポートの送信が遅すぎます
追加のサポートについては、 PlayReady テスト サーバー のメイン ドキュメントを参照してください。