Arbeitsablauf für geschützte Inhalte

Flash Player 10.1 und höher, Adobe AIR 2.0 und höher

Wichtig : In Flash Player 11.5 und höheren Versionen ist das Adobe Access-Modul bereits enthalten, sodass der Updateschritt (Aufrufen von SystemUpdater.update(SystemUpdaterType.DRM) ) nicht erforderlich ist. Dies schließt die folgenden Browser und Plattformen ein:

  • Flash Player 11.5 ActiveX-Steuerelement, für alle Plattformen außer Internet Explorer unter Windows 8 mit Intel-Prozessoren

  • Flash Player 11.5-Plug-In, für alle Browser

  • Adobe AIR (Desktop und Mobil)

Dies bedeutet, dass der Updateschritt in den folgenden Fällen weiterhin erforderlich ist :

  • Internet Explorer unter Windows 8 mit Intel-Prozessoren

  • Flash Player 11.4 und älter, außer mit Google Chrome 22 und höher (alle Plattformen) oder 21 und höher (Windows)

Hinweis: Es treten keine Probleme auf, wenn Sie SystemUpdater.update(SystemUpdaterType.DRM) in einem System mit Flash Player 11.5 oder höher aufrufen, es wird jedoch nichts heruntergeladen.

Im Folgenden wird in groben Zügen der Arbeitsablauf beschrieben, mit dem eine Anwendung geschützten Inhalt abrufen und wiedergeben kann. Bei diesem Arbeitsablauf wird davon ausgegangen, dass das Design der Anwendung das Abspielen von Inhalt, der durch Adobe Access geschützt wird, explizit ermöglicht.

  1. Die Metadaten des Inhalts werden abgerufen.

  2. Bei Bedarf wird Flash Player aktualisiert.

  3. Es wird überprüft, ob eine Lizenz lokal verfügbar ist. Wenn ja, wird die Lizenz geladen und der Arbeitsablauf wird bei Schritt 7 fortgesetzt. Andernfalls wird der Arbeitsablauf bei Schritt 4 fortgesetzt.

  4. Es wird überprüft, ob eine Authentifizierung erforderlich ist. Ist dies nicht der Fall, können Sie mit Schritt 7 fortfahren.

  5. Wenn eine Authentifizierung erforderlich ist, werden die Authentifizierungsdaten vom Benutzer abgefragt und an den Lizenzserver übergeben.

  6. Wenn die Domänenregistrierung erforderlich ist, treten Sie der Domäne bei (AIR 3.0 und höher).

  7. Nach erfolgreicher Authentifizierung wird die Lizenz vom Server heruntergeladen.

  8. Der Inhalt wird wiedergegeben.

Wenn kein Fehler auftritt und der Benutzer erfolgreich autorisiert wurde, die Inhalte anzuzeigen, löst das NetStream-Objekt ein DRMStatusEvent-Objekt aus. Dann beginnt die Anwendung mit der Wiedergabe. Das DRMStatusEvent-Objekt enthält die Gutscheininformationen, in denen die Richtlinien und Berechtigungen des Benutzers angezeigt werden. Beispielsweise definieren die Informationen in diesem Objekt, ob der Inhalt offline angezeigt werden kann und wie lange die Lizenz gültig ist. Die Anwendung kann diese Daten verwenden, um den Benutzer über den Status der Richtlinien zu informieren. Beispielsweise kann die Anwendung in einer Statusleiste die Anzahl der Tage anzeigen, die für die Ansicht der Inhalte verbleiben.

Wenn der Benutzer zum Offline-Zugriff berechtigt ist, wird der Gutschein zwischengespeichert und der verschlüsselte Inhalt wird auf das Gerät des Benutzers heruntergeladen. Der Inhalt ist so lange verfügbar, wie im Lizenz-Cache-Zeitraum angegeben. Die detail -Eigenschaft im Ereignis enthält die Angabe DRM.voucherObtained . Die Anwendung entscheidet, ob der Inhalt lokal gespeichert werden soll, damit er offline verfügbar ist. Sie können Gutscheine auch mit der DRMManager-Klasse vorausladen.

Hinweis: Das Zwischenspeichern und Vorausladen von Gutscheinen wird sowohl in AIR als auch in Flash Player unterstützt. Das Herunterladen und Speichern von verschlüsselten Inhalten wird jedoch nur in AIR unterstützt.

Die Anwendung ist dafür zuständig, die Fehlerereignisse explizit zu verarbeiten. Zu diesen Ereignissen zählen auch Fälle, in denen der Benutzer gültige Informationen eingegeben hat, der Gutschein, durch den die verschlüsselten Inhalte geschützt werden, jedoch den Zugriff auf die Inhalte einschränkt. Beispielsweise kann ein authentifizierter Benutzer nicht auf Inhalte zugreifen, wenn die anfallenden Gebühren nicht entrichtet wurden. Dieser Fall kann auch dann eintreten, wenn zwei Benutzer, die beide beim selben Herausgeber registriert sind, versuchen, Inhalte gemeinsam zu verwenden, für die nur ein Mitglied gezahlt hat. Die Anwendung muss den Benutzer über den Fehler informieren und eine Alternative anbieten. Eine typische Alternative umfasst Anleitungen dazu, wie der Benutzer sich registrieren und für die Anzeigeberechtigung zahlen kann.

Ausführlicher API-Arbeitsablauf

Im Folgenden wird der Arbeitsablauf für geschützte Inhalte ausführlicher beschrieben. Dabei werden auch die APIs vorgestellt, die für die Wiedergabe von durch Adobe Access geschützten Inhalten verwendet werden.

  1. Verwenden Sie ein URLLoader-Objekt, um die Bytes der Metadaten-Datei des geschützten Inhalts zu laden. Stellen Sie dieses Objekt auf eine Variable ein, wie beispielsweise metadata_bytes .

    Alle von Adobe Access kontrollierten Inhalte verfügen über Adobe Access-Metadaten. Wenn der Inhalt verpackt wird, können diese Metadaten als separate Datei (.metadata) mit dem Inhalt gespeichert werden. Weitere Informationen finden Sie in der Dokumentation zu Adobe Access.

  2. Erstellen Sie eine DRMContentData-Instanz. Fügen Sie diesen Code in einen try-catch-Block ein:

    new DRMContentData( metadata_bytes )

    Dabei ist metadata_bytes das URLLoader-Objekt aus Schritt 1.

  3. (Nur Flash Player) Die Laufzeit sucht das Adobe Access-Modul. Falls es nicht gefunden wird, wird ein IllegalOperationError mit DRMErrorEvent-Fehlercode 3344 oder DRMErrorEvent-Fehlercode 3343 ausgegeben.

    Zur Verarbeitung dieses Fehlers laden Sie das Adobe Access-Modul über die SystemUpdater-API herunter. Nachdem dieses Modul heruntergeladen wurde, löst das SystemUpdater-Objekt ein COMPLETE-Ereignis aus. Fügen Sie einen Ereignis-Listener für dieses Ereignis ein, mit dem der Arbeitsablauf zu Schritt 2 zurückkehrt, wenn dieses Ereignis ausgelöst wird. Diese Schritte werden im folgenden Codebeispiel gezeigt:

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

    Wenn der Player selbst aktualisiert werden muss, wird ein Statusereignis ausgelöst. Weitere Informationen zur Verarbeitung dieses Ereignisses finden Sie unter Warten auf ein Aktualisierungsereignis .

    Hinweis: In AIR-Anwendungen ist das AIR-Installationsprogramm für die Aktualisierung des Adobe Access-Moduls und die erforderlichen Laufzeitaktualisierungen zuständig.
  4. Erstellen Sie Listener, die auf die vom DRMManager-Objekt ausgelösten DRMStatusEvent- und DRMErrorEvent-Ereignisse warten:

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

    Stellen Sie im DRMStatusEvent-Listener sicher, dass der Gutschein gültig (nicht null) ist. Verarbeiten Sie im DRMErrorEvent-Listener die DRMErrorEvents-Ereignisse. Einzelheiten finden Sie unter Verwenden der DRMStatusEvent-Klasse und Verwenden der DRMErrorEvent-Klasse .

  5. Laden Sie den Gutschein (Lizenz) zum Abspielen des Inhalts.

    Versuchen Sie zunächst, eine lokal gespeicherte Lizenz zu laden:

    DRMManager.loadvoucher(drmContentData, LoadVoucherSetting.LOCAL_ONLY)

    Nach abgeschlossenem Ladevorgang löst das DRMManager-Objekt ein DRMStatusEvent.DRM_Status -Ereignis aus.

  6. Wenn das DRMVoucher-Objekt nicht null ist, ist der Gutschein gültig. Fahren Sie mit Schritt 13 fort.

  7. Wenn das DRMVoucher-Objekt null ist, überprüfen Sie die Authentifizierungsmethode, die die Richtlinie für diesen Inhalt vorgibt. Verwenden Sie die DRMContentData.authenticationMethod -Eigenschaft.

  8. Wenn die Authentifizierungsmethode ANONYMOUS ist, fahren Sie mit Schritt 13 fort.

  9. Bei der Authentifizierungsmethode USERNAME_AND_PASSWORD muss die Anwendung einen Mechanismus bereitstellen, über den der Benutzer seine Anmeldedaten eingeben kann. Übergeben Sie diese Anmeldedaten an den Lizenzserver, um den Benutzer zu authentifizieren:

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

    Das DRMManager-Objekt löst ein DRMAuthenticationErrorEvent -Ereignis aus, wenn die Authentifizierung fehlschlägt, bzw. ein DRMAuthenticationCompleteEvent -Ereignis, wenn die Authentifizierung erfolgreich ist. Erstellen Sie Listener für diese Ereignisse.

  10. Wenn die Authentifizierungsmethode UNKNOWN ist, muss eine benutzerdefinierte Authentifizierungsmethode verwendet werden. In diesem Fall hat der Content-Provider vorgesehen, dass die Authentifizierung auf eine Out-of-Band-Weise erfolgt, indem die ActionScript 3.0-APIs nicht verwendet werden. Das benutzerdefinierte Authentifizierungsverfahren muss ein Authentifizierungstoken erzeugen, das an die DRMManager.setAuthenticationToken() -Methode übergeben werden kann.

  11. Wenn die Authentifizierung fehlschlägt, muss die Anwendung zu Schritt 9 zurückkehren. Ihre Anwendung sollte einen Mechanismus enthalten, der wiederholte Authentifizierungsfehler verarbeitet und einschränkt. Beispielsweise kann nach drei Versuchen eine Meldung eingeblendet werden, die dem Benutzer mitteilt, dass die Authentifizierung erfolglos war und der Inhalt deshalb nicht abgespielt werden kann.

  12. Wenn Sie das gespeicherte Token verwenden möchten, anstatt den Benutzer zur Eingabe seiner Anmeldedaten aufzufordern, geben Sie das Token mit der DRMManager.setAuthenticationToken() -Methode an. Dann laden Sie die Lizenz vom Lizenzserver herunter und spielen den Inhalt ab, wie in Schritt 8.

  13. (Optional) Wenn die Authentifizierung erfolgreich ist, können Sie das Authentifizierungstoken erfassen. Dies ist ein im Arbeitsspeicher zwischengespeichertes Byte-Array. Rufen Sie dieses Token mit der DRMAuthenticationCompleteEvent.token -Eigenschaft ab. Sie können das Authentifizierungstoken speichern, damit der Benutzer seine Anmeldedaten für diesen Inhalt nicht mehrfach eingeben muss. Der Lizenzserver bestimmt den Gültigkeitszeitraum des Authentifizierungstokens.

  14. Bei erfolgreicher Authentifizierung laden Sie die Lizenz vom Lizenzserver herunter.

    DRMManager.loadvoucher(drmContentData, LoadVoucherSetting.FORCE_REFRESH)

    Nach abgeschlossenem Ladevorgang löst das DRMManager-Objekt ein DRMStatusEvent.DRM_STATUS-Ereignis aus. Warten Sie auf dieses Ereignis. Wenn es ausgelöst wird, kann der Inhalt wiedergegeben werden.

  15. Spielen Sie das Video ab, indem Sie ein NetStream-Objekt erstellen und dann seine play() -Methode aufrufen:

    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 und Sitzungsobjekte

Wenn DRMContentData erstellt wird, wird es als Sitzungsobjekt verwendet, das auf das Flash Player DRM-Modul verweist. Alle DRMManager -APIs, die diese DRMContentData erhalten, verwenden dieses bestimmte DRM-Modul. Es gibt jedoch 2 DRMManager -APIs, die DRMContentData nicht verwenden. Diese sind nachfolgend beschrieben:
  1. authenticate()

  2. setAuthenticationToken()

Da es kein zugeordnetes DRMContentData -Objekt gibt, führt der Aufruf dieser DRMManager -APIs dazu, dass das neueste DRM-Modul von der Festplatte verwendet wird. Dies kann problematisch sein, wenn mitten im DRM-Arbeitsablauf der Anwendung eine Aktualisierung des DRM-Moduls erfolgt. Betrachten Sie folgendes Szenario:
  1. Die Anwendung erstellt ein DRMContentData -Objekt, contentData1 , das AdobeCP1 als DRM-Modul verwendet.

  2. Die Anwendung ruft die DRMManager.authenticate(contentData1.serverURL,...) -Methode auf.

  3. Die Anwendung ruft die DRMManager.loadVoucher(contentData1, ...) -Methode auf.

Wenn das DRM-Modul aktualisiert wird, bevor die Anwendung Schritt 2 erreicht, verwendet die DRMManager.authenticate() -Methode AdobeCP2 als DRM-Modul für die Authentifizierung. Die loadVoucher() -Methode in Schritt 3 schlägt fehl, da sie immer noch AdobeCP1 als DRM-Modul verwendet. Die Aktualisierung kann erfolgt sein, weil eine andere Anwendung die DRM-Modul-Aktualisierung aufgerufen hat. Sie können dies vermeiden, indem Sie die DRM-Modul-Aktualisierung beim Starten der Anwendung aufrufen.

DRM-Ereignisse

Die Laufzeit löst zahlreiche Ereignisse aus, wenn eine Anwendung versucht, geschützten Inhalt wiederzugeben:

  • DRMDeviceGroupErrorEvent (nur AIR), abgesetzt von DRMManager

  • DRMAuthenticateEvent (nur AIR), von NetStream ausgelöst

  • DRMAuthenticationCompleteEvent, von DRMManager ausgelöst

  • DRMAuthenticationErrorEvent, von DRMManager ausgelöst

  • DRMErrorEvent, von NetStream und DRMManager ausgelöst

  • DRMStatusEvent, von NetStream und DRMManager ausgelöst

  • StatusEvent

  • NetStatusEvent. Siehe Warten auf ein Aktualisierungsereignis .

Zur Unterstützung von Inhalten, die durch Adobe Access geschützt sind, fügen Sie Ereignis-Listener zur Verarbeitung der DRM-Ereignisse hinzu.

Vorausladen von Gutscheinen für die Offlinewiedergabe

Sie können die Gutscheine (Lizenzen), die zum Abspielen von durch Adobe Access geschützten Inhalten erforderlich sind, im Voraus laden. Mithilfe von im Voraus geladenen Gutscheinen können Benutzer Inhalte anzeigen, auch wenn sie keine aktive Internetverbindung haben. (Für das Vorausladen selbst ist jedoch eine Internetverbindung erforderlich.) Zum Vorausladen von Gutscheinen können Sie die preloadEmbeddedMetadata() -Methode der NetStream-Klasse und die DRMManager-Klasse verwenden. In AIR 2.0 und höher können Sie ein DRMContentData-Objekt verwenden, um Gutscheine direkt im Voraus zu laden. Diese Technik ist vorzuziehen, da das DRMContentData-Objekt unabhängig vom Inhalt aktualisiert werden kann. (Die preloadEmbeddedData() -Methode ruft DRMContentData aus dem Inhalt ab.)

Verwenden von DRMContentData

Im Folgenden wird der Arbeitsablauf zum Vorausladen des Gutscheins für eine geschützte Mediendatei mithilfe eines DRMContentData-Objekts beschrieben.

  1. Rufen Sie die binären Metadaten für den verpackten Inhalt ab. Bei Verwendung des Adobe Access Java Reference Packager wird diese Metadaten-Datei automatisch mit der .metadata -Erweiterung erstellt. Sie können diese Metadaten beispielsweise mit der URLLoader-Klasse herunterladen.

  2. Erstellen Sie ein DRMContentData-Objekt und übergeben Sie die Metadaten an die Konstruktorfunktion:

    var drmData:DRMContentData = new DRMContentData( metadata );
  3. Die restlichen Arbeitsschritte sind mit dem Arbeitsablauf identisch, der unter Arbeitsablauf für geschützte Inhalte beschrieben wird.

Verwenden von preloadEmbeddedMetadata()

Die folgenden Schritte beschreiben den Arbeitsablauf beim Vorausladen des Gutscheins für eine DRM-geschützte Mediendatei mithilfe von preloadEmbeddedMetadata() :

  1. Laden Sie die Mediendatei herunter und speichern Sie sie. (DRM-Metadaten können nur aus lokal gespeicherten Dateien vorausgeladen werden.)

  2. Erstellen Sie die NetConnection- und NetStream-Objekte und stellen Sie Implementierungen für die onDRMContentData() - und onPlayStatus() -Rückruffunktionen des NetStream-Clientobjekts bereit.

  3. Erstellen Sie ein NetStreamPlayOptions-Objekt und stellen Sie die stream -Eigenschaft auf die URL der lokalen Mediendatei ein.

  4. Rufen Sie die NetStream-Methode preloadEmbeddedMetadata() auf und übergeben Sie dabei das NetStreamPlayOptions-Objekt, das die zu analysierende Mediendatei angibt.

  5. Wenn die Mediendatei DRM-Metadaten enthält, wird die onDRMContentData() -Rückruffunktion aufgerufen. Die Metadaten werden als ein DRMContentData-Objekt an diese Funktion übergeben.

  6. Verwenden Sie das DRMContentData-Objekt, um den Gutschein mit der loadVoucher() -Methode zu erhalten.

    Wenn die authenticationMethod -Eigenschaft des DRMContentData -Objekts den Wert flash.net.drm.AuthenticationMethod.USERNAME_AND_PASSWORD hat, authentifizieren Sie den Benutzer auf dem Medienrechteserver, bevor der Gutschein geladen wird. Die Eigenschaften serverURL und domain des DRMContentData-Objekts können zusammen mit den Anmeldedaten des Benutzers an die authenticate() -Methode des DRMManager übergeben werden.

  7. Die onPlayStatus() -Rückruffunktion wird aufgerufen, wenn das Dateiparsing abgeschlossen ist. Wenn die onDRMContentData() -Funktion nicht aufgerufen wurde, enthält die Datei nicht die für den Erhalt eines Gutscheins erforderlichen Metadaten. Dieser fehlende Aufruf kann auch bedeuten, dass diese Datei nicht von Adobe Access geschützt wird.

Im folgenden Beispielcode für AIR wird veranschaulicht, wie ein Gutschein für eine lokale Mediendatei vorausgeladen wird:

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