Udostępnij przez


Bezpieczny serwer zatrzymania dla środowiska testowego PlayReady

Przegląd

Serwer bezpiecznego zatrzymania PlayReady udostępnia punkt końcowy testowy do sprawdzania poprawności funkcji bezpiecznego zatrzymywania w implementacjach PlayReady. Funkcja Secure Stop zapewnia, że dane śledzenia zużycia multimediów są bezpiecznie przesyłane od klientów do dostawców zawartości, umożliwiając dokładne monitorowanie użycia i raportowanie zgodności.

Punkt końcowy usługi

Serwer testowy Bezpiecznego zatrzymywania jest dostępny pod adresem:

https://playready.directtaps.net/pr/svc/securestop.asmx

Protokół Secure Stop

Omówienie protokołu

Funkcja Secure Stop umożliwia klientom bezpieczne raportowanie informacji końcowych sesji:

  1. Klient rozpoczyna sesję odtwarzania
  2. Licencja określa wymagania dotyczące bezpiecznego zatrzymywania
  3. Klient generuje dane bezpiecznego zatrzymania podczas odtwarzania
  4. Po zakończeniu sesji klient wysyła raport bezpiecznego zatrzymania na serwer
  5. Serwer weryfikuje i potwierdza potwierdzenie potwierdzenia

Przepływ komunikatów

Client                    License Server           Secure Stop Server
  |                            |                           |
  |-- License Request -------->|                           |
  |<-- License Response -------|                           |
  |    (with SecureStop URL)   |                           |
  |                            |                           |
  |    [Playback Session]      |                           |
  |                            |                           |
  |-- Secure Stop Report ------|-------------------------->|
  |<-- Acknowledgment ---------|---------------------------|

Konfiguracja serwera

Wymagania dotyczące bezpiecznego zatrzymywania

Konfigurowanie bezpiecznego zatrzymania w odpowiedziach na licencje:

{
  "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"
    }
  }
}

Konfiguracja odpowiedzi serwera

Serwer obsługuje różne tryby odpowiedzi na potrzeby testowania:

{
  "responseMode": "success|failure|timeout|partial",
  "acknowledgmentDelay": 0,
  "customData": {
    "testScenario": "normal-operation"
  }
}

Punkty końcowe interfejsu API

Przesyłanie raportu bezpiecznego zatrzymywania

Punkt końcowy:POST /pr/svc/securestop.asmx/SubmitReport

Format żądania:

POST /pr/svc/securestop.asmx/SubmitReport HTTP/1.1
Host: playready.directtaps.net
Content-Type: application/octet-stream

[Secure Stop Report Data - Binary Format]

Format odpowiedzi:

HTTP/1.1 200 OK
Content-Type: application/octet-stream

[Secure Stop Acknowledgment - Binary Format]

Stan raportu zapytania

Punkt końcowy:GET /pr/svc/securestop.asmx/QueryStatus

Format żądania:

GET /pr/svc/securestop.asmx/QueryStatus?sessionId=SESSION_ID HTTP/1.1
Host: playready.directtaps.net

Format odpowiedzi:

{
  "sessionId": "session-identifier",
  "status": "pending|received|processed|error",
  "timestamp": "2024-01-15T10:30:00Z",
  "reportSize": 1024,
  "processingTime": 50
}

Scenariusze testowania

Podstawowe testowanie bezpiecznego zatrzymywania

Przetestuj normalny przepływ bezpiecznego zatrzymania:

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

Testowanie obsługi błędów

Scenariusze błędów testowych:

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

Testowanie wydajnościowe

Testowanie wydajności bezpiecznego zatrzymywania:

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

Integracja klienta

Implementacja języka 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');

Implementacja języka 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);
    }
}

Format danych

Secure Stop Report Structure

Raport bezpiecznego zatrzymywania zawiera następujące elementy:

  • Identyfikator sesji: unikatowy identyfikator sesji
  • Identyfikator zawartości: zawartość zużywana
  • Dane użycia: czas trwania odtwarzania, jakość itp.
  • Informacje o urządzeniu: szczegóły urządzenia klienckiego
  • Informacje o sygnaturze czasowej: czas rozpoczęcia/zakończenia sesji
  • Podpis cyfrowy: kryptograficzny dowód autentyczności

Walidacja raportu

Serwer weryfikuje raporty dla:

  • Integralność formatu: poprawna struktura binarna
  • Podpis cyfrowy: Autentyczność kryptograficzna
  • Ważność sesji: prawidłowe parametry sesji
  • Dokładność znacznika czasu: rozsądne wartości czasu
  • Wykrywanie duplikatów: zapobieganie zduplikowanych przesłanych danych

Funkcje zaawansowane

Obsługa danych niestandardowych

Uwzględnij dane niestandardowe w raportach bezpiecznego zatrzymania:

{
  "customData": {
    "contentProvider": "test-provider",
    "userAgent": "PlayReady-Client/4.0",
    "playbackQuality": "HD",
    "geolocation": "US-WEST"
  }
}

Raportowanie wsadowe

Przesyłanie wielu raportów bezpiecznego zatrzymania w jednym żądaniu:

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

Monitorowanie i analiza

Analiza raportów

Serwer testowy udostępnia punkty końcowe analizy:

GET /pr/svc/securestop.asmx/Analytics?period=24h

Odpowiedź obejmuje:

  • Łączna liczba odebranych raportów
  • Średni czas przetwarzania
  • Współczynniki błędów według typu
  • Dystrybucja geograficzna
  • Statystyki wersji klienta

Monitorowanie kondycji

Monitorowanie kondycji serwera:

async function checkSecureStopServerHealth() {
    const response = await fetch('https://playready.directtaps.net/pr/svc/securestop.asmx/Health');
    return await response.json();
}

Najlepsze praktyki

Wdrożenie klienta

  1. Niezawodne dostarczanie: zaimplementuj logikę ponawiania prób dla przesłanych nieudanych prób
  2. Obsługa w trybie offline: raporty kolejki, gdy sieć jest niedostępna
  3. Weryfikacja danych: weryfikowanie danych raportu przed przesłaniem
  4. Obsługa błędów: obsługa błędów serwera w sposób elastyczny
  5. Prywatność: Ochrona poufnych danych w raportach

Zalecenia dotyczące testowania

  1. Kompleksowe scenariusze: Testowanie normalnych i błędów
  2. Testowanie wydajności: weryfikowanie pod warunkami obciążenia
  3. Warunki sieciowe: testowanie przy użyciu różnych scenariuszy sieciowych
  4. Integralność danych: weryfikowanie dokładności danych raportu
  5. Testowanie zabezpieczeń: weryfikowanie składników kryptograficznych

Pomoc techniczna i rozwiązywanie problemów

W przypadku problemów z funkcją bezpiecznego zatrzymywania:

  1. Sprawdzanie, czy bezpieczny zatrzymanie jest włączone w licencji
  2. Sprawdzanie formatu i struktury raportu
  3. Weryfikowanie łączności sieciowej z serwerem
  4. Przejrzyj odpowiedź serwera, aby uzyskać szczegółowe informacje o błędzie
  5. Najpierw przetestuj przy użyciu uproszczonych scenariuszy

Typowe problemy:

  • Błędy formatu raportu: nieprawidłowy format binarny lub struktura
  • Walidacja podpisu: problemy z podpisem kryptograficznym
  • Limity czasu sieci: problemy z łącznością serwera
  • Wygaśnięcie sesji: raporty przesłane za późno

Aby uzyskać dodatkową pomoc techniczną, zapoznaj się z główną dokumentacją serwerów testowych PlayReady .