Condividi tramite


Procedura: Connettersi a un servizio di inoltro fluido di Azure

Questo articolo illustra i passaggi per eseguire il provisioning del servizio Inoltro fluido di Azure e pronto per l'uso.

Importante

Prima di poter connettere l'app a un server di inoltro fluido di Azure, è necessario effettuare il provisioning di una risorsa del server di Inoltro fluido di Azure nell'account Azure.

Il servizio Inoltro fluido di Azure è un servizio Fluido ospitato nel cloud. È possibile connettere l'applicazione Fluid a un'istanza di Inoltro fluido di Azure usando AzureClient nel pacchetto @fluidframework/azure-client . AzureClient gestisce la logica di connessione del contenitore Fluid al servizio mantenendo l'oggetto contenitore stesso indipendente dal servizio. È possibile usare un'istanza di questo client per gestire più contenitori.

Le sezioni seguenti illustrano come usare AzureClient nella propria applicazione.

Connessione al servizio

Per connettersi a un'istanza di Inoltro fluido di Azure, è prima necessario creare un oggetto AzureClient. È necessario specificare alcuni parametri di configurazione, tra cui l'ID tenant, l'URL del servizio e un provider di token per generare il token JSON Web (JWT) che verrà usato per autorizzare l'utente corrente al servizio. Il pacchetto @fluidframework/test-client-utils fornisce un InsecureTokenProvider che può essere usato a scopo di sviluppo.

Attenzione

Deve InsecureTokenProvider essere usato solo a scopo di sviluppo perché l'uso espone il segreto della chiave tenant nel bundle di codice lato client. Deve essere sostituito con un'implementazione di ITokenProvider che recupera il token dal proprio servizio back-end responsabile della firma con la chiave del tenant. Un'implementazione di esempio è AzureFunctionTokenProvider. Per altre informazioni, vedere Procedura: Scrivere un tokenProvider con una funzione di Azure. Si noti che i id campi e name sono arbitrari.

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);

Ora che è disponibile un'istanza di AzureClient, è possibile iniziare a usarla per creare o caricare contenitori Fluid.

Provider di token

AzureFunctionTokenProvider è un'implementazione di ITokenProvider che garantisce che il segreto della chiave del tenant non venga esposto nel codice bundle lato client. AzureFunctionTokenProvider accetta l'URL della funzione di Azure aggiunto insieme /api/GetAzureToken all'oggetto utente corrente. Successivamente, effettua una GET richiesta alla funzione di Azure passando tenantId, documentId e userId/userName come parametri facoltativi.

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);

Aggiunta di dati personalizzati ai token

L'oggetto utente può anche contenere altri dettagli utente facoltativi. Ad esempio:

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",
};

La funzione di Azure genererà il token per l'utente specificato firmato usando la chiave privata del tenant e lo restituirà al client senza esporre il segreto stesso.

Gestione dei contenitori

L'API AzureClient espone rispettivamente le funzioni createContainer e getContainer per creare e ottenere contenitori. Entrambe le funzioni accettano uno schema del contenitore che definisce il modello di dati del contenitore. Per la getContainer funzione è disponibile un parametro aggiuntivo per il contenitore del contenitore id da recuperare.

Nello scenario di creazione del contenitore è possibile usare il modello seguente:

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

La container.attach() chiamata è quando il contenitore diventa effettivamente connesso al servizio e viene registrato nell'archivio BLOB. Restituisce un oggetto id che rappresenta l'identificatore univoco per questa istanza del contenitore.

Qualsiasi client che vuole partecipare alla stessa sessione collaborativa deve chiamare getContainer con lo stesso contenitore id.

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

Per altre informazioni su come avviare la registrazione dei log generati da Fluid, vedere Registrazione e telemetria.

Il contenitore recuperato conterrà come initialObjects definito nello schema del contenitore. Per altre informazioni su come stabilire lo schema e usare l'oggettocontainer, vedere Modellazione dei dati in fluidframework.com.

Recupero dei dettagli del gruppo di destinatari

Chiama a createContainer e getContainer restituisce due valori: un , container descritto in precedenza, e un oggetto servizi.

container Contiene il modello di dati Fluid ed è indipendente dal servizio. Qualsiasi codice scritto in questo oggetto contenitore restituito da AzureClient è riutilizzabile con il client per un altro servizio. Un esempio è se è stato creato un prototipo dello scenario usando TinyliciousClient, tutto il codice che interagisce con gli oggetti condivisi all'interno del contenitore Fluid può essere riutilizzato quando si passa a usando AzureClient.

L'oggetto services contiene dati specifici del servizio Inoltro fluido di Azure. Questo oggetto contiene un valore del gruppo di destinatari che può essere usato per gestire l'elenco di utenti attualmente connessi al contenitore.

Il codice seguente illustra come usare l'oggetto audience per mantenere una visualizzazione aggiornata di tutti i membri attualmente in un contenitore.

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 fornisce due funzioni che restituiscono oggetti AzureMember con ID utente e nome utente:

  • getMembers restituisce una mappa di tutti gli utenti connessi al contenitore. Questi valori cambieranno ogni volta che un membro viene aggiunto o lascia il contenitore.
  • getMyself restituisce l'utente corrente in questo client.

audience genera anche eventi per quando cambia il roster dei membri. membersChanged verrà generato per tutte le modifiche del roster, mentre memberAdded e memberRemoved verrà attivato per le rispettive modifiche con i clientId valori e member che sono stati modificati. Dopo che uno di questi eventi viene generato, una nuova chiamata a getMembers restituirà l'elenco dei membri aggiornato.

Un oggetto di esempio AzureMember è simile al seguente:

{
  "userId": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
  "userName": "Test User",
  "connections": [
    {
      "id": "c699c3d1-a4a0-4e9e-aeb4-b33b00544a71",
      "mode": "write"
    },
    {
      "id": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
      "mode": "write"
    }
  ],
  "additionalDetails": {
    "email": "xyz@outlook.com",
    "address": "Redmond"
  }
}

Oltre all'ID utente, al nome e ai dettagli aggiuntivi, AzureMember gli oggetti contengono anche una matrice di connessioni. Se l'utente è connesso alla sessione con un solo client, connections avrà un solo valore in esso con l'ID del client e se è in modalità di lettura/scrittura. Tuttavia, se lo stesso utente ha effettuato l'accesso da più client ( ovvero, sono connessi da dispositivi diversi o hanno più schede del browser aperte con lo stesso contenitore), connections qui conterrà più valori per ogni client. Nei dati di esempio precedenti è possibile notare che un utente con nome "Utente di test" e l'ID "00aa00a-bb11-cc22-dd33-44ee44e4ee4e" ha attualmente il contenitore aperto da due client diversi. I valori nel campo additionalDetails corrispondono ai valori specificati nella generazione del AzureFunctionTokenProvider token.

Queste funzioni ed eventi possono essere combinati per presentare una visualizzazione in tempo reale degli utenti nella sessione corrente.

Complimenti. Il contenitore Fluid è stato connesso correttamente al servizio Inoltro fluido di Azure e sono stati recuperati i dettagli dell'utente per i membri della sessione di collaborazione.