미디어 토큰 검증기 통합

NOTE
이 페이지의 컨텐츠는 정보용으로만 제공됩니다. 이 API를 사용하려면 Adobe의 현재 라이선스가 필요합니다. 허가되지 않은 사용은 허용되지 않습니다.

미디어 토큰 검증기 정보 about-media-token-verifier

인증이 성공하면 Adobe Pass 인증에서 오래 지속되는 인증(AuthZ) 토큰을 만듭니다. AuthZ 토큰은 클라이언트의 플랫폼에 따라 클라이언트측에 전달되거나 서버측에 저장됩니다. (참조: 토큰 이해 다른 클라이언트 시스템에 토큰을 저장하는 방법과 기타 세부 정보를 살펴보십시오.)

AuthZ 토큰은 사이트 사용자에게 주어진 리소스를 볼 수 있는 권한을 부여합니다. 이는 토큰이 만료된 후 6~24시간의 일반적인 TTL(Time-to-Live)을 가집니다. 실제 보기 액세스를 위해 Adobe Pass 인증은 AuthZ 토큰을 사용하여 사용자가 가져와 미디어 서버에 전달하는 단기 미디어 토큰을 생성합니다. 이러한 단기 미디어 토큰은 매우 짧은 TTL(일반적으로 몇 분)이 있습니다.

AccessEnabler 통합에서 를 통해 단기 미디어 토큰을 얻습니다. setToken() callback. Clientless API 통합의 경우 <SP_FQDN>/api/v1/tokens/media API 호출. 토큰은 PKI(공개 키 인프라)에 기반한 토큰 보호를 사용하여 Adobe이 서명한 일반 텍스트로 전송된 문자열입니다. 이 PKI 기반 보호를 사용하면 토큰이 인증 기관에서 Adobe에 발급한 비대칭 키를 사용하여 서명됩니다.

토큰에 대한 클라이언트 측의 유효성 검사가 없기 때문에 악의적인 사용자는 도구를 사용하여 가짜 토큰을 삽입할 수 있습니다 setToken() 호출. 그러므로 그대는 할 수 없음 단순히 setToken() 사용자의 인증 여부를 고려할 때 가 트리거되었습니다. 단기 토큰 자체가 합법적인지 확인해야 합니다. 유효성 검사를 수행하는 도구는 미디어 토큰 검증기 라이브러리입니다.

TIP
유효성 검사를 위해 반환된 토큰 문자열의 전체 길이를 미디어 토큰 검증기에 전달해야 합니다.

미디어 토큰 검증기를 사용하여 단기 토큰 확인 validate-short-livedttokens

비디오 스트림을 실제로 시작하기 전에 토큰의 유효성을 검사하려면 프로그래머가 미디어 토큰 검증기 라이브러리를 사용하는 웹 서비스에 토큰을 보내는 것이 좋습니다. 단기 미디어 토큰의 매우 짧은 TTL은 토큰을 생성하는 서버와 토큰을 확인하는 서버 간의 클럭 동기화 문제를 충분히 허용하도록 정의되지만, 더 이상 그렇지 않습니다.

다음 미디어 토큰 검증기 라이브러리 은 Adobe Pass 인증 파트너에서 사용할 수 있습니다.

미디어 토큰 검증기 라이브러리는 Java 아카이브에 포함되어 있습니다 mediatoken-verifier-VERSION.jar. 라이브러리는 다음을 정의합니다.

  • 토큰 확인 API(ITokenVerifier interface), JavaDoc 설명서 사용
  • 토큰이 실제로 Adobe에서 왔는지를 확인하는 데 사용되는 Adobe 공개 키
  • 참조 구현(com.adobe.entitlement.test.EntitlementVerifierTest.java)를 사용하여 검증자 API를 사용하는 방법과 라이브러리에 포함된 Adobe 공개 키를 사용하여 원본을 확인하는 방법을 보여 줍니다

아카이브에는 모든 종속성 및 인증서 키 저장소가 포함되어 있습니다. 포함된 인증서 키 저장소의 기본 암호는 "123456"입니다.

  • 확인 라이브러리를 사용하려면 JDK 버전 1.5 이상이 필요합니다.
  • 서명 알고리즘 "SHA256WithRSA"에 대해 선호하는 JCE 공급자를 사용하십시오.

검증자 라이브러리는 토큰 콘텐츠를 분석하는 데 사용되는 유일한 수단이어야 합니다. 토큰 형식은 보장되지 않으며 향후 변경될 수 있으므로 프로그래머는 토큰을 구문 분석하고 데이터를 직접 추출해서는 안 됩니다. Verifier API만 올바르게 작동할 수 있습니다. 문자열을 직접 구문 분석하면 일시적으로 작동할 수 있지만, 나중에 형식이 변경될 수 있을 때 문제를 일으킬 수 있습니다. 검증자 API는 토큰에서 다음과 같은 정보를 검색합니다.

  • 토큰이 유효합니까(예: isValid() 방법)?
  • 토큰에 연결된 리소스 ID(ID) getResourceID() 메서드), 의 다른 매개 변수와 비교할 수 있으며 일치해야 합니다. setToken() 함수 콜백입니다. 일치하지 않으면 사기성이 있음을 나타낼 수 있습니다.
  • 토큰이 발급된 시간(getTimeIssued() 메서드).
  • TTL(getTimeToLive() 메서드).
  • MVPD에서 받은 익명 인증 GUID(getUserSessionGUID() 메서드).
  • 사용자를 인증한 배포자의 ID(인증한 경우) - 배포자에 대한 인증을 제공한 프록시-MVPD입니다.

검증자 API 사용 using-verifier-api

다음 ITokenVerifier 클래스는 지정된 리소스에 대한 토큰 신뢰성의 유효성을 검사하는 데 사용하는 메서드를 정의합니다. 사용 ITokenVerifier 에 대한 응답으로 받은 토큰을 분석하는 방법 setToken() 요청.

다음 isValid() 메서드는 토큰의 유효성을 검사하는 기본 방법입니다. 하나의 인수, 리소스 ID가 필요합니다. Null 리소스 ID를 전달하면 메서드는 토큰 신뢰성 및 유효 기간만 확인합니다.

다음 isValid() 메서드는 다음 상태 값 중 하나를 반환합니다.

VALID_TOKEN
모든 유효성 검사 성공
INVALID_TOKEN_FORMAT
토큰 형식이 잘못되었습니다.
INVALID_SIGNATURE
토큰 신뢰성을 확인할 수 없습니다.
TOKEN_EXPIRED
토큰 TTL이 잘못되었습니다.
INVALID_RESOURCE_ID
토큰이 지정된 리소스에 유효하지 않음
오류 알 수 없음
토큰이 아직 확인되지 않았습니다.

추가 메서드는 리소스 ID, 발급된 시간 및 주어진 토큰에 대한 TTL(Time-to-Live)에 대한 특정 액세스를 제공합니다.

  • 사용 getResourceID() 토큰과 연결된 리소스 ID를 검색하고 이를 setToken() 요청에서 반환된 ID와 비교합니다.
  • 사용 getTimeIssued() 토큰을 발급한 시간을 검색합니다.
  • 사용 getTimeToLive() 을 눌러 TTL을 검색합니다.
  • 사용 getUserSessionGUID() MVPD에서 설정한 익명화된 GUID를 검색합니다.
  • 사용 getMvpdId() 사용자를 인증한 MVPD의 ID를 검색합니다.
  • 사용 getProxyMvpdId() 사용자를 인증한 프록시 MVPD의 ID를 검색합니다.

샘플 코드 sample-code

미디어 토큰 검증기 아카이브에 참조 구현(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;
    }
}
recommendation-more-help
3f5e655c-af63-48cc-9769-2b6803cc5f4b