Guide pratique : Se connecter à un service Relais Azure Fluid

Cet article décrit la procédure permettant d’approvisionner votre service Relais Azure Fluid pour qu’il soit prêt à être utilisé.

Important

Pour pouvoir connecter votre application à un serveur Relais Azure Fluid, vous devez provisionner une ressource de type serveur Relais Azure Fluid sur votre compte Azure.

Le service Relais Azure Fluid est un service Fluid hébergé dans le cloud. Vous pouvez connecter votre application Fluid à une instance Azure Fluid Relay à l’aide d’AzureClient dans le package @fluidframework/azure-client . Le client AzureClient gère la logique de connexion de votre conteneur Fluid au service tout en maintenant l’objet conteneur proprement dit indépendant du service. Vous pouvez utiliser une seule instance de ce client pour gérer plusieurs conteneurs.

Les sections ci-dessous expliquent comment utiliser AzureClient dans votre propre application.

Connexion au service

Pour vous connecter à une instance Relais Azure Fluid, vous devez d’abord créer un AzureClient. Vous devez fournir des paramètres de configuration, notamment l’ID de l’abonné, l’URL de service, ainsi qu’un fournisseur de jetons permettant de générer le jeton JWT (JSON Web Token) qui sera utilisé pour autoriser l’utilisateur actuel sur le service. Le package @fluidframework/test-client-utils fournit un insecureTokenProvider qui peut être utilisé à des fins de développement.

Attention

Il InsecureTokenProvider ne doit être utilisé qu’à des fins de développement, car l’utilisation expose le secret de clé de locataire dans votre ensemble de codes côté client. Cela doit être remplacé par une implémentation d’ITokenProvider qui récupère le jeton à partir de votre propre service principal chargé de la signer avec la clé de locataire. Un exemple d’implémentation est AzureFunctionTokenProvider. Pour plus d’informations, consultez Guide pratique : Écrire un TokenProvider avec une fonction Azure. Notez que les champs id et name sont arbitraires.

const user = { id: "userId", name: "userName" };

const config = {
  tenantId: "myTenantId",
  tokenProvider: new InsecureTokenProvider("myTenantKey", user),
  endpoint: "https://myServiceEndpointUrl",
  type: "remote",
};

const clientProps = {
  connection: config,
};

const client = new AzureClient(clientProps);

Maintenant que vous disposez d’une instance AzureClient, vous pouvez commencer à l’utiliser pour créer ou charger des conteneurs Fluid.

Fournisseurs de jetons

AzureFunctionTokenProvider est une implémentation qui ITokenProvider garantit que votre clé secrète de locataire n’est pas exposée dans votre code groupé côté client. Il prend votre URL de fonction Azure, à laquelle est ajouté /api/GetAzureToken, avec l’objet utilisateur actuel. Plus tard, il envoie une requête GET à votre fonction Azure en passant tenantId, documentId et userId/userName comme paramètres optionnels.

const config = {
  tenantId: "myTenantId",
  tokenProvider: new AzureFunctionTokenProvider(
    "myAzureFunctionUrl" + "/api/GetAzureToken",
    { userId: "userId", userName: "Test User" }
  ),
  endpoint: "https://myServiceEndpointUrl",
  type: "remote",
};

const clientProps = {
  connection: config,
};

const client = new AzureClient(clientProps);

Ajout de données personnalisées à des jetons

L’objet utilisateur peut également contenir des informations supplémentaires facultatives sur l’utilisateur. Par exemple :

const userDetails = {
  email: "xyz@outlook.com",
  address: "Redmond",
};

const config = {
  tenantId: "myTenantId",
  tokenProvider: new AzureFunctionTokenProvider(
    "myAzureFunctionUrl" + "/api/GetAzureToken",
    { userId: "UserId", userName: "Test User", additionalDetails: userDetails }
  ),
  endpoint: "https://myServiceEndpointUrl",
  type: "remote",
};

Votre fonction Azure génère le jeton pour l’utilisateur signé avec la clé secrète du locataire et le retourne au client sans exposer le secret proprement dit.

Gestion des conteneurs

L’API AzureClient expose les fonctions createContainer et getContainer pour créer et obtenir des conteneurs respectivement. Elles prennent un schéma de conteneur qui définit le modèle de données de conteneur. Pour la fonction getContainer, il existe un paramètre supplémentaire correspondant à la valeur id du conteneur que vous souhaitez extraire.

Dans le scénario de création de conteneur, vous pouvez appliquer le modèle suivant :

const schema = {
  initialObjects: {
    /* ... */
  },
  dynamicObjectTypes: [
    /*...*/
  ],
};
const azureClient = new AzureClient(clientProps);
const { container, services } = await azureClient.createContainer(
  schema
);
const id = await container.attach();

L’appel container.attach() intervient lorsque le conteneur est réellement connecté au service et enregistré dans son stockage blob. Il retourne un id qui constitue l’identificateur unique de cette instance de conteneur.

Les clients qui souhaitent rejoindre la même session collaborative doivent appeler getContainer avec le même conteneur id.

const { container, services } = await azureClient.getContainer(
  id,
  schema
);

Pour savoir comment commencer l’enregistrement des journaux émis par Fluid, consultez Journalisation et télémétrie.

Le conteneur récupéré contiendra les initialObjects comme cela est défini dans le schéma de conteneur. Pour savoir comment établir le schéma et utiliser l’objet container, consultez Modélisation des données sur fluidframework.com.

Récupération des informations sur l’audience

createContainer Appelle et getContainer retourne deux valeurs : une container -- décrite ci-dessus - et un objet de services.

Le container contient le modèle de données Fluid. Il est indépendant du service. Tout le code que vous écrivez pour cet objet conteneur renvoyé par AzureClient est réutilisable avec le client pour un autre service. Par exemple, si vous avez prototyper votre scénario à l’aide de TinyliciousClient, tout votre code interagissant avec les objets partagés au sein du conteneur Fluid peut être réutilisé lors du passage à l’utilisation AzureClient.

L’objet services contient des données propres au service Relais Azure Fluid. Il comporte une valeur d’audience qui peut permettre de gérer la liste des utilisateurs actuellement connectés au conteneur.

Le code suivant montre comment utiliser l’objet audience pour conserver une vue à jour de tous les membres qui se trouvent actuellement dans un conteneur.

const { audience } = containerServices;
const audienceDiv = document.createElement("div");

const onAudienceChanged = () => {
  const members = audience.getMembers();
  const self = audience.getMyself();
  const memberStrings = [];
  const useAzure = process.env.FLUID_CLIENT === "azure";

  members.forEach((member) => {
    if (member.userId !== (self ? self.userId : "")) {
      if (useAzure) {
        const memberString = `${member.userName}: {Email: ${member.additionalDetails ? member.additionalDetails.email : ""},
                        Address: ${member.additionalDetails ? member.additionalDetails.address : ""}}`;
        memberStrings.push(memberString);
      } else {
        memberStrings.push(member.userName);
      }
    }
  });
  audienceDiv.innerHTML = `
            Current User: ${self ? self.userName : ""} <br />
            Other Users: ${memberStrings.join(", ")}
        `;
};

onAudienceChanged();
audience.on("membersChanged", onAudienceChanged);

audience fournit deux fonctions qui retournent des objets AzureMember qui ont un ID d’utilisateur et un nom d’utilisateur :

  • getMembers retourne la carte de tous les utilisateurs connectés au conteneur. Ces valeurs changent à chaque fois qu’un membre rejoint ou quitte le conteneur.
  • getMyself retourne l’utilisateur actuel présent sur ce client.

audience émet également des événements lorsque la liste des membres change. membersChanged se déclenche pour toutes les modifications de la liste, tandis que memberAdded et memberRemoved se déclenchent respectivement pour les ajouts et suppressions avec les valeurs clientId et member modifiées. Une fois qu’un de ces événements est activé, un nouvel appel à getMembers retourne la liste des membres mise à jour.

Voici un exemple d’objet AzureMember :

{
  "userId": "0e662aca-9d7d-4ff0-8faf-9f8672b70f15",
  "userName": "Test User",
  "connections": [
    {
      "id": "c699c3d1-a4a0-4e9e-aeb4-b33b00544a71",
      "mode": "write"
    },
    {
      "id": "0e662aca-9d7d-4ff0-8faf-9f8672b70f15",
      "mode": "write"
    }
  ],
  "additionalDetails": {
    "email": "xyz@outlook.com",
    "address": "Redmond"
  }
}

Outre l’ID utilisateur, le nom et les détails supplémentaires, AzureMember les objets contiennent également un tableau de connexions. Si l’utilisateur est connecté à la session avec un seul client, connections ne comporte qu’une seule valeur avec l’ID du client et le mode (lecture/écriture ou non). Toutefois, si le même utilisateur est connecté à partir de plusieurs clients (c’est-à-dire à partir de différents appareils ou en ouvrant plusieurs onglets de navigateur avec le même conteneur), connections contient plusieurs valeurs pour chaque client. Dans l’exemple de données ci-dessus, un utilisateur portant le nom « Test User » et associé à l’ID « 0e662aca-9d7d-4ff0-8faf-9f8672b70f15 » a actuellement le conteneur ouvert à partir de deux clients différents. Les valeurs du champ additionalDetails correspondent aux valeurs fournies dans la génération de AzureFunctionTokenProvider jeton.

Ces fonctions et événements peuvent être combinés pour présenter une vue en temps réel des utilisateurs de la session active.

Félicitations ! Vous avez connecté votre conteneur Fluid au service Relais Azure Fluid et récupéré les informations sur l’utilisateur pour les membres de votre session collaborative.