Integrazione di Media Token Verifier
Informazioni su Media Token Verifier about-media-token-verifier
Quando l’autorizzazione ha esito positivo, Adobe Pass Authentication crea un token di autorizzazione a lunga durata (AuthZ). Il token AuthZ viene passato al lato client o memorizzato sul lato server, a seconda della piattaforma del client. (Vedi Informazioni sui token per informazioni su come i token vengono memorizzati in sistemi client diversi, oltre ad altri dettagli.)
Un token AuthZ autorizza l’utente del sito a visualizzare una determinata risorsa. Ha un TTL (time-to-live) tipico di 6-24 ore, dopo la scadenza del token. Per l'accesso effettivo alla visualizzazione, l'autenticazione Adobe Pass utilizza il token AuthZ per generare un token multimediale di breve durata che si ottiene e si passa al server multimediale. Questi token multimediali di breve durata hanno un TTL molto breve (in genere, pochi minuti).
Nelle integrazioni AccessEnabler, si ottiene il token multimediale di breve durata tramite il callback setToken()
. Per le integrazioni API senza client, si ottiene il token Media di breve durata con la chiamata API <SP_FQDN>/api/v1/tokens/media
. Il token è una stringa inviata in testo non crittografato, firmata da un Adobe, che utilizza la protezione del token basata su PKI (Public Key Infrastructure). Con questa protezione basata su PKI, il token viene firmato utilizzando una chiave asimmetrica, rilasciata all'Adobe da un'autorità di certificazione.
Poiché non è presente alcuna convalida sul lato client per il token, un utente malintenzionato potrebbe utilizzare gli strumenti per inserire chiamate setToken()
false. Pertanto, impossibile basarsi semplicemente sul fatto che setToken()
è stato attivato, quando si considera se un utente è autorizzato o meno. Devi verificare che il token di breve durata sia legittimo. Lo strumento per eseguire la convalida è la libreria Media Token Verifier.
Convalida dei token di breve durata con Media Token Verifier validate-short-livedttokens
È consigliabile che i programmatori inviino il token a un servizio web che utilizza la Libreria Media Token Verifier, per convalidarlo prima di avviare effettivamente il flusso video. Il TTL molto breve dei token multimediali di breve durata è definito per essere sufficientemente lungo da consentire problemi di sincronizzazione dell’orologio tra il server che genera il token e il server che lo convalida, ma non più.
La Libreria di verifica dei token multimediali è disponibile per i partner di autenticazione Adobe Pass.
La libreria Media Token Verifier è contenuta nell'archivio Java mediatoken-verifier-VERSION.jar
. La libreria definisce:
- Un'API per la verifica dei token (interfaccia
ITokenVerifier
), con documentazione JavaDoc - Chiave pubblica di Adobe utilizzata per verificare che il token provenga effettivamente da Adobe
- Un'implementazione di riferimento (
com.adobe.entitlement.test.EntitlementVerifierTest.java
) che mostra come utilizzare l'API del verificatore e come utilizzare la chiave pubblica di Adobe contenuta nella libreria per verificarne l'origine
L’archivio contiene tutte le dipendenze e i keystore di certificati. La password predefinita per il registro chiavi del certificato incluso è "123456".
- La libreria di verifica richiede JDK versione 1.5 o successiva.
- Utilizza il provider JCE preferito per l’algoritmo di firma "SHA256WithRSA".
La libreria del verificatore deve essere l'unico mezzo utilizzato per analizzare il contenuto del token. I programmatori non devono analizzare il token ed estrarre i dati stessi, perché il formato del token non è garantito ed è soggetto a modifiche future. Solo l'API del verificatore può funzionare correttamente. L’analisi diretta della stringa potrebbe funzionare temporaneamente, ma causare problemi in futuro, quando il formato potrebbe cambiare. L’API del verificatore recupera informazioni dal token, ad esempio:
- Il token è valido (metodo
isValid()
)? - ID risorsa associato al token (metodo
getResourceID()
). È possibile confrontare questo ID con (e deve corrispondere) l'altro parametro del callback della funzionesetToken()
. Se non corrisponde, potrebbe indicare un comportamento fraudolento. - Ora di emissione del token (metodo
getTimeIssued()
). - Il metodo TTL (
getTimeToLive()
). - GUID di autenticazione anonima ricevuto da MVPD (metodo
getUserSessionGUID()
). - ID del distributore che ha autenticato l’utente e, se è il caso, proxy-MVPD che ha fornito l’autenticazione per il distributore.
Utilizzo dell’API di verifica using-verifier-api
La classe ITokenVerifier
definisce i metodi utilizzati per convalidare l'autenticità del token per una determinata risorsa. Utilizzare i metodi ITokenVerifier
per analizzare un token ricevuto in risposta a una richiesta setToken()
.
Il metodo isValid()
è il mezzo principale per convalidare un token. Richiede un argomento, un ID risorsa. Se trasmetti un ID risorsa nullo, il metodo convalida solo l’autenticità del token e il periodo di validità.
Il metodo isValid()
restituisce uno dei seguenti valori di stato:
I metodi aggiuntivi forniscono un accesso specifico all’ID risorsa, al tempo di emissione e al time-to-live di un determinato token.
- Utilizza
getResourceID()
per recuperare l’ID risorsa associato al token e confrontarlo con l’ID restituito dalla richiesta setToken(). - Utilizzare
getTimeIssued()
per recuperare l'ora di emissione del token. - Utilizza
getTimeToLive()
per recuperare il TTL. - Utilizzare
getUserSessionGUID()
per recuperare un GUID anonimo impostato da MVPD. - Utilizzare
getMvpdId()
per recuperare l'ID del MVPD che ha autenticato l'utente. - Utilizzare
getProxyMvpdId()
per recuperare l'ID del Proxy MVPD che ha autenticato l'utente.
Codice di esempio sample-code
L'archivio Media Token Verifier contiene un'implementazione di riferimento (com.adobe.entitlement.test.EntitlementVerifierTest.java
) e un esempio di chiamata dell'API con la classe di test. In questo esempio (com.adobe.entitlement.text.EntitlementVerifierTest.java
) viene illustrata l'integrazione della libreria di verifica dei token in un server multimediale.
package com.adobe.entitlement.test;
import com.adobe.entitlement.verifier.CryptoDataHolder;
import com.adobe.entitlement.verifier.ITokenVerifier;
import com.adobe.entitlement.verifier.ITokenVerifierFactory;
import com.adobe.entitlement.verifier.SimpleTokenPKISignatureVerifierFactory;
import com.adobe.tve.crypto.SignatureVerificationCredential;
import java.io.InputStream;
public class EntitlementVerifierTest {
String mRequestorID = null;
String mTokenToVerify = null;
String mPathToCertificate = null;
String mKeystoreType = null;
String mKeystorePasswd = null;
String mResourceID = null;
public static void main(String[] args) {
if (args == null || args.length < 2 ) {
System.out.println("Incorrect args: Usage: EntitlementVerifierTest requestorID tokenToVerify [resourceID]");
return;
}
String requestorID = args[0];
String tokenToVerify = args[1];
String pathToCertificate = "media_token_keystore.jks"; // the default keystore provided in the entitlement jar
String keystoreType = "jks";
String keystorePasswd = "123456"; // password for the default keystore
if (requestorID == null || tokenToVerify == null) {
System.out.println("One or more arguments is null");
return;
}
System.out.println("RequestorID: " + requestorID);
System.out.println("token: " + tokenToVerify);
System.out.println("cert: " + pathToCertificate);
System.out.println("keystoretype: " + keystoreType);
System.out.println("keystore passwd: " + keystorePasswd);
String resourceID = null;
if (args.length > 2) {
resourceID = args[2];
}
System.out.println("Resource ID: " + resourceID);
EntitlementVerifierTest verifier = new EntitlementVerifierTest(requestorID,
tokenToVerify, pathToCertificate, keystoreType, keystorePasswd, resourceID);
verifier.verifyToken();
}
protected EntitlementVerifierTest(String inRequestorID,
String inTokenToVerify,
String inPathToCertificate,
String inKeystoreType,
String inKeystorePasswd, String inResourceID) {
mRequestorID = inRequestorID;
mTokenToVerify = inTokenToVerify;
mPathToCertificate = inPathToCertificate;
mKeystoreType = inKeystoreType;
mKeystorePasswd = inKeystorePasswd;
mResourceID = inResourceID;
}
protected void verifyToken() {
// It is expected that the SignatureVerificationCredential and
// CryptoDataHolder could be created at Init time in a web application
// and be reused for all token verifications.
CryptoDataHolder cryptoData = createCryptoDataHolder(mPathToCertificate, mKeystoreType, mKeystorePasswd);
ITokenVerifierFactory tokenVerifierFactory = new SimpleTokenPKISignatureVerifierFactory();
ITokenVerifier tokenVerifier = tokenVerifierFactory.getInstance(mRequestorID, mTokenToVerify, cryptoData);
ITokenVerifier.eReturnValue status = tokenVerifier.isValid(mResourceID);
System.out.println("Is token Valid? : " + status.toString());
System.out.println("Token User ID: " + tokenVerifier.getUserSessionGUID());
System.out.println("Token was generated at: " + tokenVerifier.getTimeIssued());
System.out.println("Token Mvpd ID: " + tokenVerifier.getMvpdId());
System.out.println("Token Proxy Mvpd ID: " + tokenVerifier.getProxyMvpdId());
}
protected CryptoDataHolder createCryptoDataHolder(String pathToCertificate,
String keystoreType, String keystorePasswd) {
SignatureVerificationCredential verificationCredential =
readShortTokenVerificationCredential(pathToCertificate, keystoreType, keystorePasswd);
CryptoDataHolder cryptoData = new CryptoDataHolder();
cryptoData.setCertificateInfo(verificationCredential);
return cryptoData;
}
protected SignatureVerificationCredential readShortTokenVerificationCredential(String keystoreFile,
String keystoreType,
String keystorePasswd) {
SignatureVerificationCredential cred = null;
if (keystoreFile != null){
try {
// load the keystore file
ClassLoader loader = EntitlementVerifierTest.class.getClassLoader();
InputStream certInputStream = loader.getResourceAsStream(keystoreFile);
if (certInputStream != null) {
cred = new SignatureVerificationCredential(certInputStream, keystorePasswd, keystoreType);
}
}
catch (Exception e) {
System.out.println("Error creating short token server credentials: " + e.getMessage());
}
}
if (cred == null) {
System.out.println("Error creating short token server credentials");
}
return cred;
}
}