Forcer le trafic appelant à être mis en proxy sur votre propre serveur

Dans ce tutoriel, vous découvrez comment mettre en proxy votre trafic appelant Azure Communication Services sur vos propres serveurs.

Dans certaines situations, il peut être utile d’avoir tout le trafic client en proxy vers un serveur que vous pouvez contrôler. Quand le SDK s’initialise, vous pouvez fournir les détails de vos serveurs vers lesquels vous voulez router le trafic. Une fois cette option activée, tout le trafic multimédia (audio/vidéo/partage d’écran) transite par les serveurs TURN fournis au lieu de passer par Azure Communication Services, qui est l’option par défaut.

Dans ce tutoriel, vous allez apprendre à :

  • Configurez un serveur TURN.
  • Configurez un serveur proxy de signalisation.

Prérequis

Aucune

La fonctionnalité proxy est disponible en général à partir de la version publique 1.25.1 du Kit de développement logiciel (SDK) Azure Communication Services Calling. Veillez à utiliser ce SDK ou une version ultérieure du SDK quand vous essayez d’utiliser cette fonctionnalité. Ce tutoriel utilise une version du SDK Appelant 1.13.0-beta.1 où cette fonctionnalité est devenue disponible pour la première fois en préversion publique.

Proxyser un trafic média appelant

Les sections suivantes décrivent comment appeler votre trafic multimédia par proxy.

Qu’est-ce qu’un serveur TURN ?

L’établissement d’une connexion réseau entre deux homologues est souvent compliquée. Une connexion directe peut ne pas fonctionner en raison des éléments suivants :

  • Des pare-feux avec des règles strictes.
  • Des pairs situés derrière un réseau privé.
  • Des ordinateurs s’exécutant dans un environnement de traduction d’adresses réseau NAT (Network Address Translation).

Pour résoudre ces problèmes de connexion réseau, vous pouvez utiliser un serveur qui utilise le protocole TURN (Traversal Using Relay NAT) pour relayer le trafic réseau. Des serveurs STUN (Session Traversal Utilities for NAT) et TURN constituent les serveurs de relais.

Fournir les détails de vos serveurs TURN au SDK

Pour fournir les détails de vos serveurs TURN, vous devez passer des informations sur le serveur TURN à utiliser dans le cadre de CallClientOptions lors de l’initialisation de CallClient. Pour plus d’informations sur la configuration d’un appel, consultez SDK web Azure Communication Services pour un guide de démarrage rapide sur la configuration de la voix et de la vidéo.

import { CallClient } from '@azure/communication-calling'; 

const myTurn1 = {
    urls: [
        'turn:turn.azure.com:3478?transport=udp',
        'turn:turn1.azure.com:3478?transport=udp',
    ],
    username: 'turnserver1username',
    credential: 'turnserver1credentialorpass'
};

const myTurn2 = {
    urls: [
        'turn:20.202.255.255:3478',
        'turn:20.202.255.255:3478?transport=tcp',
    ],
    username: 'turnserver2username',
    credential: 'turnserver2credentialorpass'
};

// While you are creating an instance of the CallClient (the entry point of the SDK):
const callClient = new CallClient({
    networkConfiguration: {
        turn: {
            iceServers: [
                myTurn1,
                myTurn2
            ]
        }
    }
});




// ...continue normally with your SDK setup and usage.

Important

Si vous avez fourni les informations sur vos serveurs TURN lors de l’initialisation de CallClient, tout le trafic multimédia transite exclusivement via ces serveurs TURN. Les autres candidats ICE qui sont normalement générés quand vous créez un appel ne seront pas pris en compte lors de la tentative d’établissement d’une connectivité entre pairs. Cela signifie que seuls les candidats relay sont pris en compte. Pour en savoir plus sur les différents types de candidats ICE, consultez RTCIceCandidate : propriété du type.

Si le paramètre de requête ?transport n’est pas présent dans le cadre de l’URL TURN ou n’a pas une des valeurs udp, tcpou tls, le comportement par défaut est UDP.

Si une des URL fournies n’est pas valide ou n’a pas un des schémas turn:, turns: ou stun:, l’initialisation de CallClient échoue et génère des erreurs en conséquence. Les messages d’erreur générés doivent vous aider à résoudre les problèmes si vous en rencontrez.

Pour les informations de référence sur l’API pour l’objet CallClientOptions et la propriété networkConfiguration qu’il contient , consultez CallClientOptions.

Configurer un serveur TURN dans Azure

Vous pouvez créer une machine virtuelle Linux dans le portail Azure. Pour plus d’informations, consultez Guide de démarrage rapide : Créer une machine virtuelle Linux sur le Portail Azure. Pour déployer un serveur TURN, utilisez coturn. Coturn est une implémentation gratuite et open source d’un serveur TURN et STUN pour VoIP et WebRTC.

Une fois que vous avez configuré un serveur TURN, vous pouvez le tester en utilisant les instructions de la page web WebRTC Trickle ICE.

Proxyser un trafic de signalisation

Pour fournir l’URL d’un serveur proxy, vous devez la passer dans le cadre de CallClientOptions lors de l’initialisation de CallClient. Pour plus d’informations sur la configuration d’un appel, consultez SDK web Azure Communication Services pour un guide de démarrage rapide sur la configuration de la voix et de la vidéo.

import { CallClient } from '@azure/communication-calling'; 

// While you are creating an instance of the CallClient (the entry point of the SDK):
const callClient = new CallClient({
    networkConfiguration: {
        proxy: {
            url: 'https://myproxyserver.com'
        }
    }
});

// ...continue normally with your SDK setup and usage.

Remarque

Si l’URL du proxy fournie n’est pas valide, l’initialisation de CallClient échoue et génère des erreurs en conséquence. Les messages d’erreur générés doivent vous aider à résoudre les problèmes si vous en rencontrez.

Pour les informations de référence sur l’API pour l’objet CallClientOptions et la propriété networkConfiguration qu’il contient , consultez CallClientOptions.

Configurer un intergiciel de proxy de signalisation dans Express.js

Vous pouvez également créer un intergiciel de proxy dans votre configuration de serveur Express.js pour que toutes les URL soient redirigées à travers celui-ci en utilisant le package npm http-proxy-middleware. La fonction createProxyMiddleware de ce package doit couvrir ce dont vous avez besoin pour une configuration de proxy de redirection simple. En voici un exemple d’utilisation avec certains paramètres d’option dont le SDK a besoin pour que toutes nos URL fonctionnent comme attendu :

const proxyRouter = (req) => {
    // Your router function if you don't intend to set up a direct target

    // An example:
    if (!req.originalUrl && !req.url) {
        return '';
    }

    const incomingUrl = req.originalUrl || req.url;
    if (incomingUrl.includes('/proxy')) {
        return 'https://microsoft.com/forwarder/';
    }
    
    return incomingUrl;
}

const myProxyMiddleware = createProxyMiddleware({
    target: 'https://microsoft.com', // This will be ignored if a router function is provided, but createProxyMiddleware still requires this to be passed in (see its official docs on the npm page for the most recent changes)
    router: proxyRouter,
    changeOrigin: true,
    secure: false, // If you have proper SSL setup, set this accordingly
    followRedirects: true,
    ignorePath: true,
    ws: true,
    logLevel: 'debug'
});

// And finally pass in your proxy middleware to your express app depending on your URL/host setup
app.use('/proxy', myProxyMiddleware);

Conseil

Si vous rencontrez des problèmes SSL, consultez le package cors.

Configurer un serveur proxy de signalisation sur Azure

Vous pouvez créer une machine virtuelle Linux dans le portail Azure et y déployer un serveur NGINX. Pour plus d’informations, consultez Guide de démarrage rapide : Créer une machine virtuelle Linux sur le Portail Azure.

Voici une configuration NGINX que vous pouvez utiliser comme exemple :

events {
    multi_accept       on;
    worker_connections 65535;
}
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    map $request_method $access_control_header {
        OPTIONS '*';
    }
    server {
        listen <port_you_want_listen_on> ssl;
        ssl_certificate     <path_to_your_ssl_cert>;
        ssl_certificate_key <path_to_your_ssl_key>;
        location ~* ^/(.*?\.(com|net)(?::[\d]+)?)/(.*)$ {
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin '*' always;
                add_header Access-Control-Allow-Credentials 'true' always;
                add_header Access-Control-Allow-Headers '*' always;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Max-Age 1728000;
                add_header Content-Type 'text/plain';
                add_header Content-Length 0;
                return 204;
            }
            resolver 1.1.1.1;
            set $ups_host $1;
            set $r_uri $3;
            rewrite ^/.*$ /$r_uri break;
            proxy_set_header Host $ups_host;
            proxy_ssl_server_name on;
            proxy_ssl_protocols TLSv1.2;
            proxy_ssl_ciphers DEFAULT;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header Authorization;
            proxy_pass_request_headers on;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Proxy "";
            proxy_set_header Access-Control-Allow-Origin $access_control_header;
            proxy_pass https://$ups_host;
            proxy_redirect https://$ups_host https://$host/$ups_host;
            proxy_intercept_errors on;
            error_page 301 302 307 = @process_redirect;
            error_page 400 405 = @process_error_response;
        }
        location @process_redirect {
            set $saved_redirect_location '$upstream_http_location';
            resolver 1.1.1.1;
            proxy_pass $saved_redirect_location;
            add_header X-DBUG-MSG "301" always;
        }
        location @process_error_response {
            add_header Access-Control-Allow-Origin * always;
        }
    }
}

La fonctionnalité de proxy ne sera pas disponible pour les identités Teams et les actions d’interopérabilité Teams d’Azure Communication Services.

Proxyser un trafic média appelant

Les sections suivantes décrivent comment appeler votre trafic multimédia par proxy.

Qu’est-ce qu’un serveur TURN ?

L’établissement d’une connexion réseau entre deux homologues est souvent compliquée. Une connexion directe peut ne pas fonctionner en raison des éléments suivants :

  • Des pare-feux avec des règles strictes.
  • Des pairs situés derrière un réseau privé.
  • Des ordinateurs s’exécutant dans un environnement de traduction d’adresses réseau NAT (Network Address Translation).

Pour résoudre ces problèmes de connexion réseau, vous pouvez utiliser un serveur qui utilise le protocole TURN (Traversal Using Relay NAT) pour relayer le trafic réseau. Des serveurs STUN (Session Traversal Utilities for NAT) et TURN constituent les serveurs de relais.

Fournir les détails de vos serveurs TURN avec le SDK

Pour fournir les détails de vos serveurs TURN, vous devez passer des informations sur le serveur TURN à utiliser dans le cadre de CallClientOptions lors de l’initialisation de CallClient. Pour plus d’informations sur la configuration d’un appel, consultez SDK iOS Azure Communication Services pour un guide de démarrage rapide sur la configuration de la voix et de la vidéo.

let callClientOptions = new CallClientOptions()
let callNetworkOptions = new CallNetworkOptions()

let iceServer = IceServer()
iceServer.urls = ["turn:20.202.255.255"]
iceServer.udpPort = 3478
iceServer.realm = "turn.azure.com"
iceServer.username = "turnserver1username"
iceServer.password = "turnserver1password"

callNetworkOptions.iceServers = [iceServer]

// Supply the network options when creating an instance of the CallClient
callClientOptions.network = callNetworkOptions
self.callClient = CallClient(options: callClientOptions);

Important

Si vous avez fourni les informations sur vos serveurs TURN lors de l’initialisation de CallClient, tout le trafic multimédia transite exclusivement via ces serveurs TURN. Les autres candidats ICE qui sont normalement générés quand vous créez un appel ne seront pas pris en compte lors de la tentative d’établissement d’une connectivité entre pairs. Cela signifie que seuls les candidats relay sont pris en compte. Pour en savoir plus sur les différents types de candidats ICE, consultez RTCIceCandidate : propriété du type.

Actuellement, le SDK Android ne prend en charge qu’une seule adresse IPv4 et le protocole UDP pour le proxy multimédia. Si aucun port UDP n’est fourni, un port UDP par défaut 3478 est utilisé. Le Kit de développement logiciel (SDK) génère une erreur Failed to set media proxy lorsque setIceServer est appelé avec l’une des entrées suivantes non prises en charge :

  • Plusieurs serveurs ICE sont fournis dans la liste IceServers.
  • Plusieurs URL sont fournies dans la liste d’URL d’IceServer.
  • Une URL IPv6 est fournie dans la liste d’URL.
  • Seul le port TCP est fourni.
  • Les informations sur le domaine ne sont pas fournies.

Si les informations sur le serveur ICE fournies ne sont pas valides, l’initialisation CallClient échoue et génère des erreurs en conséquence.

Configurer un serveur TURN dans Azure

Vous pouvez créer une machine virtuelle Linux dans le portail Azure. Pour plus d’informations, consultez Guide de démarrage rapide : Créer une machine virtuelle Linux sur le Portail Azure. Pour déployer un serveur TURN, utilisez coturn. Coturn est une implémentation gratuite et open source d’un serveur TURN et STUN pour VoIP et WebRTC.

Une fois que vous avez configuré un serveur TURN, vous pouvez le tester en utilisant les instructions de la page web WebRTC Trickle ICE.

Proxyser un trafic de signalisation

Pour fournir l’URL d’un serveur proxy, vous devez la passer dans le cadre de CallClientOptions via sa propriété Network lors de l’initialisation de CallClient. Pour plus d’informations sur la configuration d’un appel, consultez SDK iOS Azure Communication Services pour un guide de démarrage rapide sur la configuration de la voix et de la vidéo.

let callClientOptions = CallClientOptions()
let callNetworkOptions = CallNetworkOptions()
callNetworkOptions.proxyUrl = proxyUrl
callClientOptions.network = callNetworkOptions
self.callClient = CallClient(options: callClientOptions)

// ...continue normally with your SDK setup and usage.

Configurer un serveur proxy de signalisation sur Azure

Vous pouvez créer une machine virtuelle Linux dans le portail Azure et y déployer un serveur NGINX. Pour plus d’informations, consultez Guide de démarrage rapide : Créer une machine virtuelle Linux sur le Portail Azure.

Voici une configuration NGINX que vous pouvez utiliser comme exemple :

events {
    multi_accept       on;
    worker_connections 65535;
}
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    map $request_method $access_control_header {
        OPTIONS '*';
    }
    server {
        listen <port_you_want_listen_on> ssl;
        ssl_certificate     <path_to_your_ssl_cert>;
        ssl_certificate_key <path_to_your_ssl_key>;
        location ~* ^/(.*?\.(com|net)(?::[\d]+)?)/(.*)$ {
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin '*' always;
                add_header Access-Control-Allow-Credentials 'true' always;
                add_header Access-Control-Allow-Headers '*' always;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Max-Age 1728000;
                add_header Content-Type 'text/plain';
                add_header Content-Length 0;
                return 204;
            }
            resolver 1.1.1.1;
            set $ups_host $1;
            set $r_uri $3;
            rewrite ^/.*$ /$r_uri break;
            proxy_set_header Host $ups_host;
            proxy_ssl_server_name on;
            proxy_ssl_protocols TLSv1.2;
            proxy_ssl_ciphers DEFAULT;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header Authorization;
            proxy_pass_request_headers on;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Proxy "";
            proxy_set_header Access-Control-Allow-Origin $access_control_header;
            proxy_pass https://$ups_host;
            proxy_redirect https://$ups_host https://$host/$ups_host;
            proxy_intercept_errors on;
            error_page 301 302 307 = @process_redirect;
            error_page 400 405 = @process_error_response;
        }
        location @process_redirect {
            set $saved_redirect_location '$upstream_http_location';
            resolver 1.1.1.1;
            proxy_pass $saved_redirect_location;
            add_header X-DBUG-MSG "301" always;
        }
        location @process_error_response {
            add_header Access-Control-Allow-Origin * always;
        }
    }
}

La fonctionnalité de proxy ne sera pas disponible pour les identités Teams et les actions d’interopérabilité Teams d’Azure Communication Services.

Proxyser un trafic média appelant

Les sections suivantes décrivent comment appeler votre trafic multimédia par proxy.

Qu’est-ce qu’un serveur TURN ?

L’établissement d’une connexion réseau entre deux homologues est souvent compliquée. Une connexion directe peut ne pas fonctionner en raison des éléments suivants :

  • Des pare-feux avec des règles strictes.
  • Des pairs situés derrière un réseau privé.
  • Des ordinateurs s’exécutant dans un environnement de traduction d’adresses réseau NAT (Network Address Translation).

Pour résoudre ces problèmes de connexion réseau, vous pouvez utiliser un serveur qui utilise le protocole TURN (Traversal Using Relay NAT) pour relayer le trafic réseau. Des serveurs STUN (Session Traversal Utilities for NAT) et TURN constituent les serveurs de relais.

Fournir les détails de vos serveurs TURN avec le SDK

Pour fournir les détails de vos serveurs TURN, vous devez passer des informations sur le serveur TURN à utiliser dans le cadre de CallClientOptions lors de l’initialisation de CallClient. Pour plus d’informations sur la configuration d’un appel, consultez SDK Android Azure Communication Services pour un guide de démarrage rapide sur la configuration de la voix et de la vidéo.

CallClientOptions callClientOptions = new CallClientOptions();
CallNetworkOptions callNetworkOptions = new CallNetworkOptions();

IceServer iceServer = new IceServer();
iceServer.setUrls(Arrays.asList("turn:20.202.255.255"));
iceServer.setUdpPort(3478);
iceServer.setRealm("turn.azure.com"); // Realm information is required.
iceServer.setUsername("turnserver1username");
iceServer.setPassword("turnserver1password");

callNetworkOptions.setIceServers(Arrays.asList(iceServer));

// Supply the network options when creating an instance of the CallClient
callClientOptions.setNetwork(callNetworkOptions);
CallClient callClient = new CallClient(callClientOptions);

Important

Si vous avez fourni les informations sur vos serveurs TURN lors de l’initialisation de CallClient, tout le trafic multimédia transite exclusivement via ces serveurs TURN. Les autres candidats ICE qui sont normalement générés quand vous créez un appel ne seront pas pris en compte lors de la tentative d’établissement d’une connectivité entre pairs. Cela signifie que seuls les candidats relay sont pris en compte. Pour en savoir plus sur les différents types de candidats ICE, consultez RTCIceCandidate : propriété du type.

Actuellement, le SDK Android ne prend en charge qu’une seule adresse IPv4 et le protocole UDP pour le proxy multimédia. Si aucun port UDP n’est fourni, un port UDP par défaut 3478 est utilisé. Le Kit de développement logiciel (SDK) génère une erreur Failed to set media proxy lorsque setIceServer est appelé avec l’une des entrées suivantes non prises en charge :

  • Plusieurs serveurs ICE sont fournis dans la liste IceServers.
  • Plusieurs URL sont fournies dans la liste d’URL d’IceServer.
  • Une URL IPv6 est fournie dans la liste d’URL.
  • Seul le port TCP est fourni.
  • Les informations sur le domaine ne sont pas fournies.

Si les informations sur le serveur ICE fournies ne sont pas valides, l’initialisation CallClient échoue et génère des erreurs en conséquence.

Configurer un serveur TURN dans Azure

Vous pouvez créer une machine virtuelle Linux dans le portail Azure. Pour plus d’informations, consultez Guide de démarrage rapide : Créer une machine virtuelle Linux sur le Portail Azure. Pour déployer un serveur TURN, utilisez coturn. Coturn est une implémentation gratuite et open source d’un serveur TURN et STUN pour VoIP et WebRTC.

Une fois que vous avez configuré un serveur TURN, vous pouvez le tester en utilisant les instructions de la page web WebRTC Trickle ICE.

Proxyser un trafic de signalisation

Pour fournir l’URL d’un serveur proxy, vous devez la passer dans le cadre de CallClientOptions via sa propriété Network lors de l’initialisation de CallClient. Pour plus d’informations sur la configuration d’un appel, consultez SDK Android Azure Communication Services pour un guide de démarrage rapide sur la configuration de la voix et de la vidéo.

CallClientOptions callClientOptions = new CallClientOptions();
CallNetworkOptions callNetworkOptions = new CallNetworkOptions();
callNetworkOptions.setProxyUrl("https://myproxyserver.com");
callClientOptions.setNetwork(callNetworkOptions);
CallClient callClient = new CallClient(callClientOptions);

// ...continue normally with your SDK setup and usage.

Configurer un serveur proxy de signalisation sur Azure

Vous pouvez créer une machine virtuelle Linux dans le portail Azure et y déployer un serveur NGINX. Pour plus d’informations, consultez Guide de démarrage rapide : Créer une machine virtuelle Linux sur le Portail Azure.

Voici une configuration NGINX que vous pouvez utiliser comme exemple :

events {
    multi_accept       on;
    worker_connections 65535;
}
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    map $request_method $access_control_header {
        OPTIONS '*';
    }
    server {
        listen <port_you_want_listen_on> ssl;
        ssl_certificate     <path_to_your_ssl_cert>;
        ssl_certificate_key <path_to_your_ssl_key>;
        location ~* ^/(.*?\.(com|net)(?::[\d]+)?)/(.*)$ {
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin '*' always;
                add_header Access-Control-Allow-Credentials 'true' always;
                add_header Access-Control-Allow-Headers '*' always;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Max-Age 1728000;
                add_header Content-Type 'text/plain';
                add_header Content-Length 0;
                return 204;
            }
            resolver 1.1.1.1;
            set $ups_host $1;
            set $r_uri $3;
            rewrite ^/.*$ /$r_uri break;
            proxy_set_header Host $ups_host;
            proxy_ssl_server_name on;
            proxy_ssl_protocols TLSv1.2;
            proxy_ssl_ciphers DEFAULT;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header Authorization;
            proxy_pass_request_headers on;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Proxy "";
            proxy_set_header Access-Control-Allow-Origin $access_control_header;
            proxy_pass https://$ups_host;
            proxy_redirect https://$ups_host https://$host/$ups_host;
            proxy_intercept_errors on;
            error_page 301 302 307 = @process_redirect;
            error_page 400 405 = @process_error_response;
        }
        location @process_redirect {
            set $saved_redirect_location '$upstream_http_location';
            resolver 1.1.1.1;
            proxy_pass $saved_redirect_location;
            add_header X-DBUG-MSG "301" always;
        }
        location @process_error_response {
            add_header Access-Control-Allow-Origin * always;
        }
    }
}

La fonctionnalité de proxy ne sera pas disponible pour les identités Teams et les actions d’interopérabilité Teams d’Azure Communication Services.

Proxyser un trafic média appelant

Les sections suivantes décrivent comment appeler votre trafic multimédia par proxy.

Qu’est-ce qu’un serveur TURN ?

L’établissement d’une connexion réseau entre deux homologues est souvent compliquée. Une connexion directe peut ne pas fonctionner en raison des éléments suivants :

  • Des pare-feux avec des règles strictes.
  • Des pairs situés derrière un réseau privé.
  • Des ordinateurs s’exécutant dans un environnement de traduction d’adresses réseau NAT (Network Address Translation).

Pour résoudre ces problèmes de connexion réseau, vous pouvez utiliser un serveur qui utilise le protocole TURN (Traversal Using Relay NAT) pour relayer le trafic réseau. Des serveurs STUN (Session Traversal Utilities for NAT) et TURN constituent les serveurs de relais.

Fournir les détails de vos serveurs TURN avec le SDK

Pour fournir les détails de vos serveurs TURN, vous devez passer des informations sur le serveur TURN à utiliser dans le cadre de CallClientOptions lors de l’initialisation de CallClient. Pour plus d’informations sur la configuration d’un appel, consultez SDK Windows Azure Communication Services pour un guide de démarrage rapide sur la configuration de la voix et de la vidéo.

CallClientOptions callClientOptions = new CallClientOptions();
CallNetworkOptions callNetworkOptions = new CallNetworkOptions();

IceServer iceServer = new IceServer();
iceServer.Uris = new List<Uri>() { new Uri("turn:20.202.255.255") }.AsReadOnly();
iceServer.UdpPort = 3478;
iceServer.Realm = "turn.azure.com";
iceServer.Username = "turnserver1username";
iceServer.Password = "turnserver1password";

callNetworkOptions.IceServers = new List<IceServer>() { iceServer }.AsReadOnly();

// Supply the network options when creating an instance of the CallClient
callClientOptions.Network = callNetworkOptions;
CallClient callClient = new CallClient(callClientOptions);

Important

Si vous avez fourni les informations sur vos serveurs TURN lors de l’initialisation de CallClient, tout le trafic multimédia transite exclusivement via ces serveurs TURN. Les autres candidats ICE qui sont normalement générés quand vous créez un appel ne seront pas pris en compte lors de la tentative d’établissement d’une connectivité entre pairs. Cela signifie que seuls les candidats relay sont pris en compte. Pour en savoir plus sur les différents types de candidats ICE, consultez RTCIceCandidate : propriété du type.

Actuellement, le SDK Android ne prend en charge qu’une seule adresse IPv4 et le protocole UDP pour le proxy multimédia. Si aucun port UDP n’est fourni, un port UDP par défaut 3478 est utilisé. Le Kit de développement logiciel (SDK) génère une erreur Failed to set media proxy lorsque setIceServer est appelé avec l’une des entrées suivantes non prises en charge :

  • Plusieurs serveurs ICE sont fournis dans la liste IceServers.
  • Plusieurs URL sont fournies dans la liste d’URL d’IceServer.
  • Une URL IPv6 est fournie dans la liste d’URL.
  • Seul le port TCP est fourni.
  • Les informations sur le domaine ne sont pas fournies.

Si les informations sur le serveur ICE fournies ne sont pas valides, l’initialisation CallClient échoue et génère des erreurs en conséquence.

Configurer un serveur TURN dans Azure

Vous pouvez créer une machine virtuelle Linux dans le portail Azure. Pour plus d’informations, consultez Guide de démarrage rapide : Créer une machine virtuelle Linux sur le Portail Azure. Pour déployer un serveur TURN, utilisez coturn. Coturn est une implémentation gratuite et open source d’un serveur TURN et STUN pour VoIP et WebRTC.

Une fois que vous avez configuré un serveur TURN, vous pouvez le tester en utilisant les instructions de la page web WebRTC Trickle ICE.

Proxyser un trafic de signalisation

Pour fournir l’URL d’un serveur proxy, vous devez la passer dans le cadre de CallClientOptions via sa propriété Network lors de l’initialisation de CallClient. Pour plus d’informations sur la configuration d’un appel, consultez SDK Windows Azure Communication Services pour un guide de démarrage rapide sur la configuration de la voix et de la vidéo.

CallClientOptions callClientOptions = new CallClientOptions();
CallNetworkOptions callNetworkOptions = new CallNetworkOptions();
callNetworkOptions.ProxyUri = new Uri("https://myproxyserver.com");
callClientOptions.Network = callNetworkOptions;
CallClient callClient = new CallClient(callClientOptions);

// ...continue normally with your SDK setup and usage.

Configurer un serveur proxy de signalisation sur Azure

Vous pouvez créer une machine virtuelle Linux dans le portail Azure et y déployer un serveur NGINX. Pour plus d’informations, consultez Guide de démarrage rapide : Créer une machine virtuelle Linux sur le Portail Azure.

Voici une configuration NGINX que vous pouvez utiliser comme exemple :

events {
    multi_accept       on;
    worker_connections 65535;
}
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    map $request_method $access_control_header {
        OPTIONS '*';
    }
    server {
        listen <port_you_want_listen_on> ssl;
        ssl_certificate     <path_to_your_ssl_cert>;
        ssl_certificate_key <path_to_your_ssl_key>;
        location ~* ^/(.*?\.(com|net)(?::[\d]+)?)/(.*)$ {
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin '*' always;
                add_header Access-Control-Allow-Credentials 'true' always;
                add_header Access-Control-Allow-Headers '*' always;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Max-Age 1728000;
                add_header Content-Type 'text/plain';
                add_header Content-Length 0;
                return 204;
            }
            resolver 1.1.1.1;
            set $ups_host $1;
            set $r_uri $3;
            rewrite ^/.*$ /$r_uri break;
            proxy_set_header Host $ups_host;
            proxy_ssl_server_name on;
            proxy_ssl_protocols TLSv1.2;
            proxy_ssl_ciphers DEFAULT;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header Authorization;
            proxy_pass_request_headers on;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Proxy "";
            proxy_set_header Access-Control-Allow-Origin $access_control_header;
            proxy_pass https://$ups_host;
            proxy_redirect https://$ups_host https://$host/$ups_host;
            proxy_intercept_errors on;
            error_page 301 302 307 = @process_redirect;
            error_page 400 405 = @process_error_response;
        }
        location @process_redirect {
            set $saved_redirect_location '$upstream_http_location';
            resolver 1.1.1.1;
            proxy_pass $saved_redirect_location;
            add_header X-DBUG-MSG "301" always;
        }
        location @process_error_response {
            add_header Access-Control-Allow-Origin * always;
        }
    }
}