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í:
xrRemotingRequestAuthenticationTokenCallbackMSFT
vygeneruje nebo načte ověřovací token, který se má odeslat.xrRemotingValidateServerCertificateCallbackMSFT
, ověří řetěz certifikátů.xrRemotingValidateAuthenticationTokenCallbackMSFT
ověří 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.