Zabezpečené připojení pomocí Holographic Remoting a rozhraní OpenXR API

Při použití rozhraní OpenXR API je všechna zabezpečená rozhraní API související s připojením k dispozici jako součást XR_MSFT_holographic_remoting rozšíření OpenXR.

Důležité

Pokud se chcete dozvědět o rozhraní OPENXR rozšíření Holographic Remoting, podívejte se na specifikaci , kterou najdete v úložišti GitHub s ukázkami vzdálené komunikace Holographic.

Nezapomeňte, že pokud chcete povolit zabezpečení připojení, musíte implementovat vlastní vzdálené aplikace a aplikace přehrávače. Obě vlastní aplikace potřebují:

  • Zprostředkovatel certifikátu a validátor ověřování, pokud aplikace běží jako server.
  • Zprostředkovatel ověřování a validátor certifikátů, pokud aplikace běží jako klient.

Rozhraní OpenXR API je podobné rozhraní API Windows Mixed Reality popsané tady. Místo implementace rozhraní jsou ale klíčovými prvky pro zabezpečené připojení pomocí XR_MSFT_holographic_remoting rozšíření OpenXR následující zpětná volání:

  • xrRemotingRequestAuthenticationTokenCallbackMSFTvygeneruje nebo načte ověřovací token, který se má odeslat.
  • xrRemotingValidateServerCertificateCallbackMSFT, ověří řetěz certifikátů.
  • xrRemotingValidateAuthenticationTokenCallbackMSFTověří ověřovací token klienta.
  • xrRemotingRequestServerCertificateCallbackMSFT, dodáte serverové aplikaci certifikát, který se má použít.

Poznámka

U Holografické vzdálené komunikace je možné, že serverem v závislosti na vašich potřebách je player nebo remote (další informace najdete v tématu Holographic Remoting Terminology). Pokud vaše vlastní vzdálená aplikace nebo aplikace vlastního přehrávače může běžet jako klient a server, musí aplikace poskytnout všechna čtyři zpětná volání.

Zpětná volání lze poskytnout vzdálenému modulu runtime OpenXR prostřednictvím xrRemotingSetSecureConnectionClientCallbacksMSFT a xrRemotingSetSecureConnectionServerCallbacksMSFT. K tomu můžete vytvořit statické funkce pro zpětná volání:

class SecureConnectionCallbacks {
public:
    ...

    // Static callbacks
    static XrResult XRAPI_CALL
    RequestAuthenticationTokenStaticCallback(XrRemotingAuthenticationTokenRequestMSFT* authenticationTokenRequest) {
        if (!authenticationTokenRequest->context) {
            return XR_ERROR_RUNTIME_FAILURE;
        }
        return reinterpret_cast<SecureConnectionCallbacks*>(authenticationTokenRequest->context)
            ->RequestAuthenticationToken(authenticationTokenRequest);
    }

    static XrResult XRAPI_CALL
    ValidateServerCertificateStaticCallback(XrRemotingServerCertificateValidationMSFT* serverCertificateValidation) {
        if (!serverCertificateValidation->context) {
            return XR_ERROR_RUNTIME_FAILURE;
        }
        return reinterpret_cast<SecureConnectionCallbacks*>(serverCertificateValidation->context)
            ->ValidateServerCertificate(serverCertificateValidation);
    }

    static XrResult XRAPI_CALL
    ValidateAuthenticationTokenStaticCallback(XrRemotingAuthenticationTokenValidationMSFT* authenticationTokenValidation) {
        if (!authenticationTokenValidation->context) {
            return XR_ERROR_RUNTIME_FAILURE;
        }
        return reinterpret_cast<SecureConnectionCallbacks*>(authenticationTokenValidation->context)
            ->ValidateAuthenticationToken(authenticationTokenValidation);
    }

    static XrResult XRAPI_CALL
    RequestServerCertificateStaticCallback(XrRemotingServerCertificateRequestMSFT* serverCertificateRequest) {
        if (!serverCertificateRequest->context) {
            return XR_ERROR_RUNTIME_FAILURE;
        }
        return reinterpret_cast<SecureConnectionCallbacks*>(serverCertificateRequest->context)
            ->RequestServerCertificate(serverCertificateRequest);
    }
}

Všechny statické funkce zpětného volání vypadají podobně a ve výše uvedeném příkladu pouze volají funkci pro objekt kontextu, který je nastaven v xrRemotingSetSecureConnectionClientCallbacksMSFT nebo xrRemotingSetSecureConnectionServerCallbacksMSFT. Vlastní implementace zpětných volání se pak provádí uvnitř členských funkcí kontextového objektu:

class SecureConnectionCallbacks {   
    ...

private:
    // The client has to provide a token and has to validate the certificate.
    XrResult RequestAuthenticationToken(XrRemotingAuthenticationTokenRequestMSFT* authenticationTokenRequest) {
        // To provide a token fill out the authenticationTokenRequest with your token.
    }
    XrResult ValidateServerCertificate(XrRemotingServerCertificateValidationMSFT* serverCertificateValidation) {
        // Validate the certificate.
    }

    // The server has to provide a certificate and hast to validate the token.
    XrResult ValidateAuthenticationToken(XrRemotingAuthenticationTokenValidationMSFT* authenticationTokenValidation) {
        // Validate the token.
    }
    XrResult RequestServerCertificate(XrRemotingServerCertificateRequestMSFT* serverCertificateRequest) {
        // To provide a certificate fill out the serverCertificateRequest with your certificate.
    }
}

Teď můžete zadat zpětná volání pro xrRemotingSetSecureConnectionClientCallbacksMSFT a xrRemotingSetSecureConnectionServerCallbacksMSFT. Kromě toho je potřeba povolit zabezpečené připojení prostřednictvím parametru secureConnection ve XrRemotingConnectInfoMSFT struktuře nebo XrRemotingListenInfoMSFT struktuře v závislosti na tom, jestli používáte xrRemotingConnectMSFT nebo xrRemotingListenMSFT:

...

SecureConnectionCallbacks callbackObject;

...

if (client) 
{
    XrRemotingSecureConnectionClientCallbacksMSFT clientCallbacks{static_cast<XrStructureType>(XR_TYPE_REMOTING_SECURE_CONNECTION_CLIENT_CALLBACKS_MSFT);
    clientCallbacks.context = &callbackObject;
    clientCallbacks.requestAuthenticationTokenCallback = SecureConnectionCallbacks::RequestAuthenticationTokenStaticCallback;
    clientCallbacks.validateServerCertificateCallback = SecureConnectionCallbacks::ValidateServerCertificateStaticCallback;
    clientCallbacks.performSystemValidation = true;
    CHECK_XRCMD(m_extensions.xrRemotingSetSecureConnectionClientCallbacksMSFT(m_instance.Get(), m_systemId, &clientCallbacks));
    
    ...

    connectInfo.secureConnection = true; // Enable secure connection!
    CHECK_XRCMD(m_extensions.xrRemotingConnectMSFT(m_instance.Get(), m_systemId, &connectInfo));
}

if (server) 
{
    XrRemotingSecureConnectionServerCallbacksMSFT serverCallbacks{static_cast<XrStructureType>(XR_TYPE_REMOTING_SECURE_CONNECTION_SERVER_CALLBACKS_MSFT);
    serverCallbacks.context = &callbackObject;
    serverCallbacks.requestServerCertificateCallback = SecureConnectionCallbacks::RequestServerCertificateStaticCallback;
    serverCallbacks.validateAuthenticationTokenCallback = SecureConnectionCallbacks::ValidateAuthenticationTokenStaticCallback;
    serverCallbacks.authenticationRealm = /*YourAuthenticationRealm*/;
    CHECK_XRCMD(m_extensions.xrRemotingSetSecureConnectionServerCallbacksMSFT(m_instance.Get(), m_systemId, &serverCallbacks));

    ...

    listenInfo.secureConnection = true; // Enable secure connection!
    CHECK_XRCMD(m_extensions.xrRemotingListenMSFT(m_instance.Get(), m_systemId, &listenInfo));
}

Poznámka

Podrobný příklad najdete v ukázkové aplikaci OpenXR.

Viz také