媒體權杖 media-tokens

IMPORTANT
此頁面上的內容僅供參考。 使用此API需要Adobe的目前授權。 不允許未經授權的使用。

媒體權杖是由Adobe Pass驗證REST API V2產生的Token,此授權決定旨在提供受保護內容(資源)的檢視存取權。

媒體權杖在問題發生時指定的有限和短時間範圍(預設為7分鐘)內有效,這表示在使用者端應用程式必須驗證和使用它之前的時間限制。 媒體權杖僅限於一次性使用,且絕對不可快取。

媒體權杖由以明文傳送的公開金鑰基礎結構(PKI)為基礎的已簽署字串組成。 透過以PKI為基礎的保護,權杖會使用由憑證授權單位(CA)核發給Adobe的不對稱金鑰來簽署。

媒體權杖會傳遞至程式設計師,然後程式設計師可在啟動視訊串流之前,使用媒體權杖驗證器來驗證它,以確保該資源存取的安全性。

媒體權杖驗證器是由Adobe Pass驗證所分發的程式庫,負責驗證媒體權杖的真實性。

媒體權杖驗證器 media-token-verifier

Adobe Pass驗證建議程式設計師將媒體權杖傳送至他們自己的後端服務,整合媒體權杖驗證器程式庫,以在起始視訊資料流之前確保安全存取。 媒體權杖的存留時間(TTL)旨在解決權杖產生伺服器和驗證伺服器之間的潛在時鐘同步問題。

Adobe Pass驗證強烈建議不要剖析媒體權杖並直接擷取其資料,因為無法保證權杖格式,且未來可能會變更。 媒體權杖驗證器程式庫應該是唯一用於分析權杖內容的工具。

媒體權杖驗證器程式庫可從下列連結下載:

  • https://tve.zendesk.com/hc/en-us/articles/204963159-Media-Token-Verifier-library

媒體權杖驗證器程式庫需要JDK 1.5版或更新版本,並支援使用簽章演演算法(SHA256WithRSA)偏好的Java加密延伸(JCE)提供者。

mediatoken-verifier-VERSION.jar Java封存所代表的媒體權杖驗證器程式庫包含:

  • Adobe公開金鑰。
  • 權杖驗證API (ITokenVerifier.java)。
  • 參考實作(com.adobe.entitlement.test.EntitlementVerifierTest.java)。
  • 相依性和憑證金鑰存放區。
IMPORTANT
包含的憑證金鑰存放區的預設密碼為123456

方法 methods

ITokenVerifier類別定義下列方法:

  • 用來驗證媒體權杖的isValid()方法。 它接受單一引數,資源識別碼。 如果提供的資源識別碼為null,則方法只會驗證媒體權杖的真實性和有效期間。

    isValid()方法傳回下列其中一個狀態值:

    table 0-row-2 1-row-2 2-row-2 3-row-2 4-row-2 5-row-2
    VALID_TOKEN 權杖驗證成功
    INVALID_TOKEN_FORMAT 權杖格式無效
    INVALID_SIGNATURE 無法驗證權杖真實性
    TOKEN_EXPIRED 權杖TTL無效
    INVALID_RESOURCE_ID 權杖對指定資源無效
    ERROR_UNKNOWN 權杖尚未驗證
  • getResourceID()方法用來擷取與媒體權杖關聯的資源識別碼,並將其與授權決定回應傳回的識別碼進行比較。

  • 用來擷取發出媒體權杖時間的getTimeIssued()方法。

  • 用來擷取媒體權杖的TTL的getTimeToLive()方法。

  • 用來擷取MVPD所設定的匿名GUID的getUserSessionGUID()方法。

  • getMvpdId()方法,用於擷取已驗證使用者的MVPD識別碼。

  • getProxyMvpdId()方法,用於擷取驗證使用者的Proxy MVPD識別碼。

範例 sample

媒體權杖驗證器封存包含參考實作(com.adobe.entitlement.test.EntitlementVerifierTest.java)和以測試類別叫用API的範例。 此範例(com.adobe.entitlement.text.EntitlementVerifierTest.java)說明媒體權杖驗證器程式庫整合到媒體伺服器中的情形。

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

REST API V2 rest-api-v2

可使用以下API擷取媒體Token:

請參閱上述API的​ 回應 ​和​ 範例 ​區段,瞭解授權決定和媒體權杖的結構。

IMPORTANT
使用者端應用程式不需要查詢個別端點來擷取媒體權杖,因為它們已包含在允許使用者存取的授權決定中。

如需有關如何及何時整合上述API的詳細資訊,請參閱以下檔案:

recommendation-more-help
3f5e655c-af63-48cc-9769-2b6803cc5f4b