Compartilhar via


Secure Stop Server for PlayReady Test Environment

Visão geral

O PlayReady Secure Stop Server fornece um ponto de extremidade de teste para validar a funcionalidade de parada segura em implementações do PlayReady. O Secure Stop garante que os dados de acompanhamento de consumo de mídia sejam transmitidos com segurança de clientes para provedores de conteúdo, permitindo relatórios precisos de monitoramento de uso e conformidade.

Ponto de extremidade de serviço

O servidor de teste de Parada Segura está disponível em:

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

Protocolo de Parada Segura

Visão geral do protocolo

A Parada Segura permite que os clientes relatem informações de término da sessão com segurança:

  1. O cliente inicia a sessão de reprodução
  2. Licença especifica requisitos de parada segura
  3. O cliente gera dados de parada seguros durante a reprodução
  4. No final da sessão, o cliente envia um relatório de parada segura para o servidor
  5. Servidor valida e confirma confirmação

Fluxo de Mensagens

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

Configuração do servidor

Requisitos de parada segura

Configurar a parada segura nas respostas de licença:

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

Configuração de resposta do servidor

O servidor dá suporte a vários modos de resposta para teste:

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

Pontos de extremidade de API

Enviar relatório de parada segura

Ponto de extremidade:POST /pr/svc/securestop.asmx/SubmitReport

Formato da solicitação:

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

[Secure Stop Report Data - Binary Format]

Formato de resposta:

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

[Secure Stop Acknowledgment - Binary Format]

Status do relatório de consulta

Ponto de extremidade:GET /pr/svc/securestop.asmx/QueryStatus

Formato da solicitação:

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

Formato de resposta:

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

Cenários de teste

Teste básico de parada segura

Testar o fluxo normal de parada segura:

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

Teste de tratamento de erros

Cenários de erro de teste:

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

Teste de desempenho

Testar o desempenho de parada segura:

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

Integração de Cliente

Implementação do 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');

Implementação de 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);
    }
}

Formato de dados

Estrutura de relatório de parada segura

O relatório de parada segura contém:

  • Identificador de sessão: ID de sessão exclusiva
  • Identificador de Conteúdo: Conteúdo sendo consumido
  • Dados de uso: duração da reprodução, qualidade etc.
  • Informações do dispositivo: detalhes do dispositivo cliente
  • Informações do carimbo de data/hora: horários de início/término da sessão
  • Assinatura Digital: Prova criptográfica de autenticidade

Validação de relatório

O servidor valida relatórios para:

  • Formatar Integridade: Estrutura binária correta
  • Assinatura Digital: autenticidade criptográfica
  • Validade da sessão: parâmetros de sessão válidos
  • Precisão do carimbo de data/hora: valores de tempo razoáveis
  • Detecção duplicada: prevenção de envios duplicados

Recursos avançados

Suporte a dados personalizados

Inclua dados personalizados em relatórios de parada segura:

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

Relatórios em lote

Envie vários relatórios de parada segura em uma única solicitação:

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

Monitoramento e Análise

Análise de Relatórios

O servidor de teste fornece pontos de extremidade de análise:

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

A resposta inclui:

  • Total de relatórios recebidos
  • Tempo médio de processamento
  • Taxas de erro por tipo
  • Distribuição geográfica
  • Estatísticas de versão do cliente

Monitoramento de saúde

Monitorar a integridade do servidor:

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

Práticas recomendadas

Implementação do cliente

  1. Entrega Confiável: implementar lógica de repetição para envios com falha
  2. Suporte offline: fila relata quando a rede está indisponível
  3. Validação de dados: validar dados de relatório antes do envio
  4. Tratamento de erros: manipular erros de servidor normalmente
  5. Privacidade: proteger dados confidenciais em relatórios

Recomendações de teste

  1. Cenários abrangentes: testar condições normais e de erro
  2. Teste de desempenho: validar em condições de carga
  3. Condições de Rede: Testar com vários cenários de rede
  4. Integridade de dados: verificar a precisão dos dados do relatório
  5. Teste de segurança: validar componentes criptográficos

Suporte e solução de problemas

Para problemas com a funcionalidade de parada segura:

  1. Verificar se a parada segura está habilitada na licença
  2. Verificar o formato e a estrutura do relatório
  3. Validar a conectividade de rede com o servidor
  4. Examinar a resposta do servidor para obter detalhes de erro
  5. Teste primeiro com cenários simplificados

Problemas comuns:

  • Erros de formato de relatório: formato binário ou estrutura inválido
  • Validação de assinatura: problemas de assinatura criptográfica
  • Tempos limite de rede: problemas de conectividade do servidor
  • Expiração da sessão: relatórios enviados tarde demais

Para obter suporte adicional, consulte a documentação principal dos Servidores de Teste do PlayReady .