Workflow voor beveiligde inhoud

Flash Player 10.1 of hoger, Adobe AIR 2.0 of hoger

Belangrijk : Flash Player 11.5 en hoger integreert de Adobe Access-module, zodat een update (het aanroepen van SystemUpdater.update(SystemUpdaterType.DRM) ) onnodig is. Dit omvat de volgende browsers en platforms:

  • Flash Player 11.5 ActiveX-besturingselement voor alle platforms behalve Internet Explorer op Windows 8 op Intel-processoren

  • Flash Player 11.5-insteekmodule voor alle browsers

  • Adobe AIR (voor desktop en mobiel)

Dit betekent dat de update nog steeds vereist is in de volgende gevallen:

  • Internet Explorer op Windows 8 op Intel-processoren

  • Flash Player 11.4 en lager, behalve op Google Chrome 22 en hoger (alle platforms) of 21 en hoger (Windows)

Opmerking: U kunt SystemUpdater.update(SystemUpdaterType.DRM) nog steeds veilig aanroepen op een systeem met Flash Player 11.5 of hoger, maar er wordt niet gedownload.

In de volgende overzichtsworkflow kunt u zien hoe u met een toepassing beveiligde inhoud kunt ophalen en afspelen. Er wordt aangenomen dat de toepassing specifiek is ontworpen voor het afspelen van inhoud die is beveiligd door Adobe Access:

  1. Haal de metagegevens van de inhoud op.

  2. Handel indien nodig updates voor Flash Player af.

  3. Controleer of er een lokale licentie is. Indien wel, laad de licentie en ga naar stap 7. Indien niet, ga naar stap 4.

  4. Controleer of verificatie wordt vereist. Indien niet, ga naar stap 7.

  5. Indien verificatie wordt vereist, verkrijg de verificatiegegevens van de gebruiker en geef deze door aan de licentieserver.

  6. Als domeinregistratie is vereist, voegt u zich bij het domein (AIR 3.0 en hoger).

  7. Na succesvolle verificatie kan de licentie worden gedownload van de server.

  8. Speel de inhoud af.

Als er geen fout is opgetreden en de gebruiker is geautoriseerd om de inhoud weer te geven, verzendt het NetStream-object een DRMStatusEvent-object. Hierna begint de toepassing met het afspelen. Het DRMStatusEvent-object bevat de gerelateerde bongegevens die het beleid en de toegangsrechten voor de gebruiker identificeren. In object vindt u bijvoorbeeld informatie over het feit of de inhoud offline beschikbaar kan worden gemaakt of wanneer de licentie verloopt. De toepassing kan deze gegevens gebruiken om de gebruiker zijn status mee te delen. Voorbeeld: de toepassing kan in een statusbalk aangeven hoeveel dagen de gebruiker de inhoud nog kan bekijken.

Als offlinetoegang is toegestaan, wordt de voucher in het cachegeheugen opgeslagen en wordt de gecodeerde inhoud gedownload naar de computer van de gebruiker. De inhoud is beschikbaar gedurende de periode die is gedefinieerd in de duur van de licentiecache. De eigenschap detail in de gebeurtenis bevat "DRM.voucherObtained" . De toepassing bepaalt waar de inhoud lokaal wordt opgeslagen om deze vervolgens offline toegankelijk te maken. U kunt vouchers ook vooraf laden met de klasse DRMManager.

Opmerking: Het opslaan in de cache en het vooraf laden van vouchers is zowel toegestaan in AIR als in Flash Player. Het downloaden en opslaan van gecodeerde inhoud wordt echter alleen ondersteund in AIR.

Het is de verantwoordelijkheid van de toepassing om de foutgebeurtenissen expliciet af te handelen. Bijvoorbeeld als de gebruiker geldige gegevens invoert maar de voucher die de gecodeerde inhoud beveiligt, de toegang tot de inhoud beperkt. Zo heeft een geverifieerde gebruiker geen toegang tot de inhoud als er niet voor de rechten is betaald. Hetzelfde geval kan zich tevens voordoen wanneer twee geregistreerde leden van dezelfde uitgever inhoud proberen te delen, waarvoor slechts één van de leden heeft betaald. De toepassing moet de gebruiker op de hoogte stellen van de fout en een alternatieve suggestie bieden. De alternatieve suggestie zou in dit geval kunnen bestaan uit instructies voor het registreren en betalen voor weergaverechten.

Gedetailleerde API-workflow

Hier vindt u een meer gedetailleerde versie van de workflow voor beveiligde inhoud. In deze workflow worden de specifieke API's beschreven waarmee de inhoud die is beveiligd door Adobe Access wordt afgespeeld.

  1. Gebruik een URLLoader-object om de bytes van het metagegevensbestand van de beveiligde inhoud te laden. Stel dit object in als een variabele, bijvoorbeeld metadata_bytes .

    Alle inhoud die door Adobe Access wordt beheerd, beschikt over Adobe Access-metagegevens. Wanneer de inhoud in een pakket wordt geplaatst, kunnen deze metagegevens worden opgeslagen als een afzonderlijk metagegevensbestand (.metadata), naast de inhoud. Raadpleeg de documentatie bij Adobe Access voor meer informatie.

  2. Creëer een DRMContentData-instantie. Plaats deze code in een 'try-catch'-blok:

    new DRMContentData( metadata_bytes )

    waarbij metadata_bytes staat voor het URLLoader-object van stap 1.

  3. (Alleen Flash Player) Het runtimeprogramma zoekt naar de Adobe Access-module. Als deze niet wordt gevonden, wordt een IllegalOperationError gegenereerd met DRMErrorEvent-foutcode 3344 of DRMErrorEvent-foutcode 3343.

    Download de Adobe Access-module met de SystemUpdater-API om deze fout af te handelen. Nadat u deze module hebt gedownload, verzendt het SystemUpdater-object een COMPLETE-gebeurtenis. Neem een gebeurtenislistener op voor deze gebeurtenis die teruggaat naar stap 2 wanneer deze gebeurtenis wordt verzonden. Deze stappen worden in de volgende code gedemonstreerd:

    flash.system.SystemUpdater.addEventListener(Event.COMPLETE, updateCompleteHandler); 
    flash.system.SystemUpdater.update(flash.system.SystemUpdaterType.DRM)
    private function updateCompleteHandler (event:Event):void { 
        /*redo step 2*/ 
        drmContentData = new DRMContentData(metadata_bytes); 
    } 

    Als de versie van Player zelf moet worden bijgewerkt, wordt een statusgebeurtenis verzonden. Zie Luisteren naar een updategebeurtenis voor meer informatie over het afhandelen van deze gebeurtenis.

    Opmerking: Bij AIR-toepassingen wordt het bijwerken van de Adobe Access-module en de vereiste runtime-updates afgehandeld door het installatieprogramma van AIR.
  4. Maak listeners om te luisteren naar DRMStatusEvent en DRMErrorEvent die worden verzonden door het DRMManager-object:

    DRMManager.addEventListener(DRMStatusEvent.DRM_STATUS, onDRMStatus); 
    DRMManager.addEventListener(DRMErrorEvent.DRM_ERROR, onDRMError);

    Controleer in de DRMStatusEvent-listener dat de voucher geldig is (niet null). Verwerk DRMErrorEvents in de DRMErrorEvent-listener. Zie De klasse DRMStatusEvent gebruiken en De klasse DRMErrorEvent gebruiken .

  5. Laad de voucher (licentie) die nodig is om de inhoud af te spelen.

    Probeer eerst om de inhoud af te spelen door een lokaal opgeslagen licentie te laden.

    DRMManager.loadvoucher(drmContentData, LoadVoucherSetting.LOCAL_ONLY)

    Na het laden wordt DRMStatusEvent.DRM_Status verzonden door het DRMManager-object.

  6. Als het DRMVoucher-object niet de waarde null heeft, is de voucher geldig. Ga verder met stap 13.

  7. Als het DRMVoucher-object de waarde null heeft, controleert u de verificatiemethode die volgens de beleidsregels vereist is voor deze inhoud. Gebruik de eigenschap DRMContentData.authenticationMethod .

  8. Als de verificatiemethode ANONYMOUS is, gaat u naar stap 13.

  9. Als de verificatiemethode USERNAME_AND_PASSWORD is, moet uw toepassing een mechanisme bieden waarmee de gebruiker zijn verificatiegegevens kan invoeren. Geef deze verificatiegegevens door aan de licentieserver, zodat de gebruiker kan worden geverifieerd.

    DRMManager.authenticate(metadata.serverURL, metadata.domain, username, password)

    De DRMManager verzendt een DRMAuthenticationErrorEvent als de verificatie mislukt en een DRMAuthenticationCompleteEvent als de verificatie lukt. Maak listeners voor deze gebeurtenissen.

  10. Als de verificatiemethode UNKNOWN is, dient een aangepaste verificatiemethode te worden gebruikt. In dit geval heeft de inhoudsprovider ervoor gekozen de verificatie offline uit te voeren door niet gebruik te maken van de ActionScript 3.0-API's. De aangepaste verificatieprocedure dient een verificatietoken op te leveren dat kan worden doorgegeven aan de DRMManager.setAuthenticationToken() -methode.

  11. Als de verificatie mislukt, moet uw toepassing teruggaan naar stap 9. Zorg ervoor dat uw toepassing een mechanisme heeft voor het omgaan met en beperken van herhaalde mislukte verificatiepogingen. Zo kunt u na drie pogingen een bericht weergeven voor de gebruiker dat de verificatie is mislukt en dat de inhoud niet kan worden afgespeeld.

  12. Als u het opgeslagen token wilt gebruiken, in plaats van de gebruiker te vragen naar zijn verificatiegegevens, kunt u het token instellen met de methode DRMManager.setAuthenticationToken() . Vervolgens downloadt u de licentie van de licentieserver en speelt u de inhoud af, zoals aangegeven in stap 8.

  13. Als de verificatie is gelukt, kunt u het verificatietoken vastleggen (optioneel). Dit token is een bytearray die in het geheugen is opgeslagen. U kunt het token ophalen met de eigenschap DRMAuthenticationCompleteEvent.token . Vervolgens kunt u het verificatietoken opslaan en toepassen, zodat de gebruiker niet telkens zijn verificatiegegevens voor de desbetreffende inhoud hoeft in te voeren. De licentieserver bepaalt de geldige periode van het verificatietoken.

  14. Na succesvolle verificatie kan de licentie worden gedownload van de licentieserver:

    DRMManager.loadvoucher(drmContentData, LoadVoucherSetting.FORCE_REFRESH)

    Na het laden wordt DRMStatusEvent.DRM_STATUS verzonden door het DRMManager-object. Luister naar deze gebeurtenis. Wanneer de gebeurtenis wordt verzonden kunt u de inhoud afspelen.

  15. Speel de video af door een NetStream-object te maken en vervolgens de methode play() hiervan aan te roepen.

    stream = new NetStream(connection); 
    stream.addEventListener(DRMStatusEvent.DRM _STATUS, drmStatusHandler); 
    stream.addEventListener(DRMErrorEvent.DRM_ERROR, drmErrorHandler); 
    stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); 
    stream.client = new CustomClient(); 
    video.attachNetStream(stream); 
    stream.play(videoURL); 

DRMContentData- en sessieobjecten

Wanneer DRMContentData wordt gemaakt, wordt deze gebruikt als een sessieobject dat naar de Flash Player DRM-module verwijst. Alle DRMManager -API's die deze DRMContentData ontvangen, gebruiken deze specifieke DRM-module. Er zijn echter twee DRMManager -API's die niet gebruikmaken van DRMContentData , namelijk:
  1. authenticate()

  2. setAuthenticationToken()

Aangezien er geen gekoppelde DRMContentData zijn, wordt na het aanroepen van DRMManager -API's de meest recente DRM-module van de schijf gebruikt. Dit kan problemen opleveren als de DRM-module wordt bijgewerkt tijdens de DRM-workflow van de toepassing. Overweeg het volgende scenario:
  1. De toepassing maakt een DRMContentData -object contentData1 dat AdobeCP1 gebruikt als de DRM-module.

  2. De toepassing roept de methode DRMManager.authenticate(contentData1.serverURL,...) aan.

  3. De toepassing roept de methode DRMManager.loadVoucher(contentData1, ...) aan.

Als een update van de DRM-module wordt uitgevoerd voordat de toepassing stap 2 bereikt, voert de methode DRMManager.authenticate() de verificatie uit met gebruik van AdobeCP2 als de DRM-module. De loadVoucher() -methode in stap 3 mislukt, aangezien deze nog steeds AdobeCP1 gebruikt als de DRM-module. De update is wellicht uitgevoerd omdat een andere toepassing de update van de DRM-module heeft aangeroepen. U kunt dit scenario vermijden door de update van de DRM-module tijdens het starten van de toepassing aan te roepen.

DRM-gerelateerde gebeurtenissen

Wanneer een toepassing beveiligde inhoud wil afspelen, verzendt het runtimeprogramma een groot aantal gebeurtenissen:

  • DRMDeviceGroupErrorEvent (alleen AIR), verzonden door DRMManager

  • DRMAuthenticateEvent (alleen AIR), verzonden door NetStream

  • DRMAuthenticationCompleteEvent, verzonden door DRMManager

  • DRMAuthenticationErrorEvent, verzonden door DRMManager

  • DRMErrorEvent, verzonden door NetStream en DRMManager

  • DRMStatusEvent, verzonden door NetStream en DRMManager

  • StatusEvent

  • NetStatusEvent. Zie Luisteren naar een updategebeurtenis .

Als u inhoud wilt ondersteunen die wordt beveiligd door Adobe Access, moet u gebeurtenislisteners toevoegen om de DRM-gebeurtenissen af te handelen.

Vouchers voor offline afspelen vooraf laden

U kunt de vouchers (licenties) die nodig zijn om de door Adobe Access beveiligde inhoud af te spelen vooraf laden. Als gebruikers beschikken over vooraf geladen vouchers, kunnen ze de inhoud ook weergeven wanneer ze geen actieve internetverbinding hebben. (Voor het vooraf laden is wel een internetverbinding vereist.) Met de methode preloadEmbeddedMetadata() van de NetStream-klasse en de DRMManager-klasse kunt u vouchers op voorhand laden. Bij AIR 2.0 en hoger kunt u vouchers nu rechtstreeks vooraf laden met een DRMContentData-object. Deze techniek verdient de voorkeur, omdat u het DRMContentData-object onafhankelijk van de inhoud kunt bijwerken. (Met de methode preloadEmbeddedData() wordt DRMContentData opgehaald van de inhoud.)

DRMContentData gebruiken

De volgende procedure beschrijft de workflow voor het vooraf laden van de voucher voor een beveiligd mediabestand met een DRMContentData-object.

  1. Haal de binaire metagegevens op voor de inhoud die in een pakket is opgenomen. Als u de Access Java Reference Packager gebruikt, wordt dit metagegevensbetand automatisch gegenereerd. Het bestand heeft de extensie .metadata . U kunt deze metagegevens bijvoorbeeld downloaden met de URLLoader-klasse.

  2. Maak een DRMContentData-object en geef de metagegevens door aan de constructorfunctie:

    var drmData:DRMContentData = new DRMContentData( metadata );
  3. De overige stappen zijn gelijk aan de procedure die is beschreven in Workflow voor beveiligde inhoud .

preloadEmbeddedMetadata() gebruiken

In de volgende stappen wordt de workflow beschreven voor het vooraf laden van een voucher voor een DRM-beveiligd mediabestand met preloadEmbeddedMetadata() :

  1. Download het mediabestand en sla het op. (DRM-metagegevens kunnen alleen vooraf worden geladen uit lokaal opgeslagen bestanden.)

  2. Maak de NetConnection- en NetStream-objecten en geef hierbij implementaties op voor de callback-functies onDRMContentData() en onPlayStatus() van het NetStream-clientobject.

  3. Maak een NetStreamPlayOptions-object en stel de waarde van de eigenschap stream in op de URL van het lokale mediabestand.

  4. Roep de methode preloadEmbeddedMetadata() van NetStream aan en geef het NetStreamPlayOptions-object door waarin het mediabestand wordt geïdentificeerd dat moet worden geparseerd.

  5. Als het mediabestand DRM-metagegevens bevat, wordt de callback-functie onDRMContentData() aangeroepen. De metagegevens worden doorgegeven naar deze functie in de vorm van een DRMContentData-object.

  6. Gebruik het DRMContentData-object om de bon te verkrijgen met behulp van de methode loadVoucher() van DRMManager.

    Als de eigenschap authenticationMethod van het DRMContentData-object de waarde flash.net.drm.AuthenticationMethod.USERNAME_AND_PASSWORD heeft, moet u de gebruiker verifiëren op de mediarechtenserver voordat u de voucher laadt. De eigenschappen serverURL en domain van het DRMContentData-object kunnen samen met de gebruikersreferenties worden doorgegeven aan de DRMManager-methode authenticate() .

  7. De callback-functie onPlayStatus() wordt geactiveerd wanneer de bestandsparsering is voltooid. Als de functie onDRMContentData() niet is aangeroepen, bevat het bestand niet de vereiste metagegevens om een voucher te verkrijgen. Als deze aanroep ontbreekt, betekent dit mogelijk ook dat dit bestand niet door Adobe Access wordt beveiligd.

In de volgende code voor AIR wordt geïllustreerd hoe u een voucher vooraf kunt laden voor een lokaal mediabestand:

package 
{ 
import flash.display.Sprite; 
import flash.events.DRMAuthenticationCompleteEvent; 
import flash.events.DRMAuthenticationErrorEvent; 
import flash.events.DRMErrorEvent;   
import flash.ev ents.DRMStatusEvent; 
import flash.events.NetStatusEvent; 
import flash.net.NetConnection; 
import flash.net.NetStream; 
import flash.net.NetStreamPlayOptions; 
import flash.net.drm.AuthenticationMethod; 
import flash.net.drm.DRMContentData; 
import flash.net.drm.DRMManager; 
import flash.net.drm.LoadVoucherSetting;   
public class DRMPreloader extends Sprite  
{ 
     private var videoURL:String = "app-storage:/video.flv"; 
    private var userName:String = "user"; 
    private var password:String = "password";  
    private var preloadConnection:NetConnection; 
    private var preloadStream:NetStream; 
    private var drmManager:DRMManager = DRMManager.getDRMManager(); 
    private var drmContentData:DRMContentData; 
    public function DRMPreloader():void { 
        drmManager.addEventListener( 
            DRMAuthenticationCompleteEvent.AUTHENTICATION_COMPLETE, 
            onAuthenticationComplete); 
        drmManager.addEventListener(DRMAuthenticationErrorEvent.AUTHENTICATION_ERROR, 
            onAuthenticationError);             
        drmManager.addEventListener(DRMStatusEvent.DRM_STATUS, onDRMStatus); 
        drmManager.addEventListener(DRMErrorEvent.DRM_ERROR, onDRMError); 
        preloadConnection = new NetConnection(); 
        preloadConnection.addEventListener(NetStatusEvent.NET_STATUS, onConnect); 
        preloadConnection.connect(null);            
    } 
 
    private function onConnect( event:NetStatusEvent ):void 
    { 
        preloadMetadata(); 
    } 
    private function preloadMetadata():void 
    { 
        preloadStream = new NetStream( preloadConnection ); 
        preloadStream.client = this; 
        var options:NetStreamPlayOptions = new NetStreamPlayOptions(); 
        options.streamName = videoURL; 
        preloadStream.preloadEmbeddedData( options );                         
    }     
    public function onDRMContentData( drmMetadata:DRMContentData ):void 
    { 
        drmContentData = drmMetadata; 
        if ( drmMetadata.authenticationMethod == AuthenticationMethod.USERNAME_AND_PASSWORD ) 
        { 
            authenticateUser(); 
        } 
        else 
            { 
                getVoucher(); 
            } 
    } 
    private function getVoucher():void 
    { 
        drmManager.loadVoucher( drmContentData, LoadVoucherSetting.ALLOW_SERVER ); 
    } 
 
    private function authenticateUser():void 
    { 
        drmManager.authenticate( drmContentData.serverURL, drmContentData.domain, userName, password ); 
    } 
    private function onAuthenticationError( event:DRMAuthenticationErrorEvent ):void 
    { 
        trace( "Authentication error: " + event.errorID + ", " + event.subErrorID ); 
    } 
 
    private function onAuthenticationComplete( event:DRMAuthenticationCompleteEvent ):void 
    { 
        trace( "Authenticated to: " + event.serverURL + ", domain: " + event.domain ); 
        getVoucher(); 
    } 
    private function onDRMStatus( event:DRMStatusEvent ):void 
    { 
        trace( "DRM Status: " + event.detail); 
        trace("--Voucher allows offline playback = " + event.isAvailableOffline ); 
        trace("--Voucher already cached          = " + event.isLocal ); 
        trace("--Voucher required authentication = " + !event.isAnonymous ); 
    } 
    private function onDRMError( event:DRMErrorEvent ):void 
    { 
        trace( "DRM error event: " + event.errorID + ", " + event.subErrorID + ", " + event.text ); 
    } 
    public function onPlayStatus( info:Object ):void 
    { 
        preloadStream.close(); 
    } 
} 
}