Workflow voor beveiligde inhoudFlash Player 10.1 of hoger, Adobe AIR 2.0 of hoger
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 afpelen van inhoud die is beveiligd door Flash Access:
Haal de metagegevens van de inhoud op.
Handel indien nodig updates voor Flash Player af.
Controleer of er een lokale licentie is. Indien wel, laad de licentie en ga naar stap 7. Indien niet, ga naar stap 4.
Controleer of verificatie wordt vereist. Indien niet, ga naar stap 7.
Indien verificatie wordt vereist, verkrijg de verificatiegegevens van de gebruiker en geef deze door aan de licentieserver.
Na succesvolle verificatie kan de licentie worden gedownload van de server.
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 de gebruiker offline toegang heeft, wordt de voucher in het cachegeheugen opgeslagen en wordt de gecodeerde inhoud gedownload naar het apparaat van de gebruiker (alleen AIR). De inhoud is beschikbaar in de tijdsduur die wordt gedefinieerd in de offline leaseperiode. 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.
Bij elke DRM-gerelateerde fout wordt door de toepassing een DRMErrorEvent-gebeurtenisobject verzonden (in AIR is dit een DRMAuthenticationErrorEvent-object. Het is de verantwoordelijkheid van de toepassing om alle andere 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 Flash Access wordt afgespeeld.
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 Flash Access wordt beheert, beschikt over Flash 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 Flash Access voor meer informatie.
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.
Het runtimeprogramma zoekt naar de Flash Access-module (alleen Flash Player). Indien deze module niet wordt gevonden, wordt een IllegalOperationError met foutcode 3344 gegenereerd.
Download de Flash Access-module met de SystemUpater-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 Flash Access-module en de vereiste runtime-updates afgehandeld door het installatieprogramma van AIR.
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.
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.
Als het DRMVoucher-object niet de waarde null heeft, is de voucher geldig. Ga verder met stap 13.
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.
Als de verificatiemethode ANONYMOUS is, gaat u naar stap 13.
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.
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.
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.
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.
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.
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);
DRM-gerelateerde gebeurtenissenWanneer een toepassing beveiligde inhoud wil afspelen, verzendt het runtimeprogramma een groot aantal gebeurtenissen:
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 Flash Access, moet u gebeurtenislisteners toevoegen om de DRM-gebeurtenissen af te handelen.
Bonnen voor offline afspelen vooraf laden
U kunt de vouchers (licenties) die nodig zijn om de door Flash 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.
Haal de binaire metagegevens op voor de inhoud die in een pakket is opgenomen. Als u Flash 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.
Maak een DRMContentData-object en geef de metagegevens door aan de constructorfunctie:
var drmData:DRMContentData = new DRMContentData( metadata );
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():
Download het mediabestand en sla het op. (DRM-metagegevens kunnen alleen vooraf worden geladen uit lokaal opgeslagen bestanden.)
Maak de NetConnection- en NetStream-objecten en geef hierbij implementaties op voor de callback-functies onDRMContentData() en onPlayStatus() van het NetStream-clientobject.
Maak een NetStreamPlayOptions-object en stel de waarde van de eigenschap stream in op de URL van het lokale mediabestand.
Roep de methode preloadEmbeddedMetadata() van NetStream aan en geef het NetStreamPlayOptions-object door waarin het mediabestand wordt geïdentificeerd dat moet worden geparseerd.
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.
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 userNameAndPassword 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().
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 Flash 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();
}
}
}
|
|