Dynamisches Erstellen einer Microsoft Teams-Besprechung mit Microsoft Graph

In dieser Übung automatisieren Sie den Prozess des Erstellens eines Microsoft Teams-Besprechungslinks und übergeben diesen mit Hilfe von Azure Functions und Microsoft Graph an den ACS.

Erstellen einer Teams-Besprechung

  1. Sie müssen eine Microsoft Entra-ID-App für die Daemon-App-Authentifizierung erstellen. In diesem Schritt wird die Authentifizierung im Hintergrund mit App-Anmeldeinformationen behandelt, und eine Microsoft Entra-ID-App verwendet Anwendungsberechtigungen, um Microsoft Graph-API-Aufrufe auszuführen. Microsoft Graph wird verwendet, um dynamisch eine Microsoft Teams-Besprechung zu erstellen und die Teams-Besprechungs-URL zurückzugeben.

  2. Führen Sie die folgenden Schritte aus, um eine Microsoft Entra ID-App zu erstellen:

    1. Wechseln Sie zum Azure-Portal , und wählen Sie "Microsoft Entra-ID" aus.
    2. Wählen Sie die Registerkarte "App-Registrierung " gefolgt von +Neue Registrierung aus.
    3. Füllen Sie die Details des neuen App-Registrierungsformulars aus, wie unten dargestellt, und wählen Sie "Registrieren" aus:
      • Name: ACS Teams Interop-App
      • Unterstützte Kontotypen: Konten in jedem Organisationsverzeichnis (beliebiges Microsoft Entra ID-Verzeichnis – Multitenant) und persönliche Microsoft-Konten (z. B. Skype, Xbox)
      • Umleitungs-URI: Lassen Sie diesen Wert leer.
    4. Wechseln Sie nach der Registrierung der App zu API-Berechtigungen und wählen Sie + Berechtigung hinzufügen aus.
    5. Wählen Sie Microsoft Graph gefolgt von Anwendungsberechtigungen aus.
    6. Wählen Sie die Calendars.ReadWrite Berechtigung und dann "Hinzufügen" aus.
    7. Nachdem Sie die Berechtigungen hinzugefügt haben, wählen Sie "Administratorzustimmung für <YOUR_ORGANIZATION_NAME> erteilen" aus.
    8. Wechseln Sie zur Registerkarte "Zertifikate und geheime Schlüssel ", wählen Sie "+Neuer geheimer Clientschlüssel" und dann "Hinzufügen" aus.
    9. Kopieren Sie den Wert des geheimen Schlüssels in eine lokale Datei. Sie verwenden den Wert später in dieser Übung.
    10. Wechseln Sie zur Registerkarte „Übersicht“ und kopieren Sie Application (client) ID und Directory (tenant) ID in dieselbe lokale Datei, die Sie im vorherigen Schritt verwendet haben.

Erstellen einer local.settings.json Datei

  1. Öffnen Sie das samples/acs-to-teams-meeting/server/csharp/GraphACSFunctions.sln in Visual Studio oder den Ordner GraphACSFunctions in Visual Studio Code.

  2. Wechseln Sie zum GraphACSFunctions Projekt, und erstellen Sie eine local.settings.json Datei mit den folgenden Werten:

    {
        "IsEncrypted": false,
        "Values": {
            "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
            "TENANT_ID": "",
            "CLIENT_ID": "",
            "CLIENT_SECRET": "",
            "USER_ID": "",
            "ACS_CONNECTION_STRING": ""
        },
        "Host": {
            "LocalHttpPort": 7071,
            "CORS": "*",
            "CORSCredentials": false
        },
        "watchDirectories": [
            "Shared"
        ]
    }
    
    • Verwenden Sie die Werte, die Sie in einer früheren Übung in die lokale Datei kopiert haben, um die Werte TENANT_ID, CLIENT_ID und CLIENT_SECRET zu aktualisieren.
    • Definieren Sie USER_ID mit der Benutzer-ID, mit der Sie eine Microsoft Teams-Besprechung erstellen möchten.

    Sie können die Benutzer-ID aus dem Azure-Portal abrufen.

    • Melden Sie sich mit Ihrem Microsoft 365-Entwicklermandantenadministratorkonto an.
    • Wählen Sie Microsoft Entra ID aus.
    • Navigieren Sie zur Registerkarte "Benutzer " auf der Seitenleiste.
    • Suchen Sie nach Ihrem Benutzernamen, und wählen Sie ihn aus, um die Benutzerdetails anzuzeigen.
    • Object ID stellt User ID innerhalb der Benutzerdetails dar. Kopieren Sie den Object ID Wert, und verwenden Sie ihn für den USER_ID Wert in local.settings.json.

    Abrufen der Benutzer-ID aus der Microsoft Entra-ID

    Hinweis

    ACS_CONNECTION_STRING wird in der nächsten Übung verwendet, damit Sie sie noch nicht aktualisieren müssen.

  3. Öffnen Sie GraphACSFunctions.sln im acs-to-teams-meeting/server/csharp-Ordner, und beachten Sie, dass sie die folgenden Microsoft Graph- und Identitätspakete enthält:

    <PackageReference Include="Azure.Communication.Identity" Version="1.3.1" />
    <PackageReference Include="Azure.Identity" Version="1.11.2" />
    <PackageReference Include="Microsoft.Graph" Version="5.51.0" />
    
  4. Wechseln Sie zu Program.cs , und notieren Sie sich den folgenden Code in der ConfigureServices Methode:

        var host = new HostBuilder()
            .ConfigureFunctionsWebApplication()
            .ConfigureServices(services => {
                services.AddApplicationInsightsTelemetryWorkerService();
                services.ConfigureFunctionsApplicationInsights();
                services.AddSingleton(static p =>
                {
                    var config = p.GetRequiredService<IConfiguration>();
                    var clientSecretCredential = new ClientSecretCredential(
                        config.GetValue<string>("TENANT_ID"),
                        config.GetValue<string>("CLIENT_ID"),
                        config.GetValue<string>("CLIENT_SECRET")
                    );
    
                    return new GraphServiceClient(
                        clientSecretCredential,
                        ["https://graph.microsoft.com/.default"]
                    );
                });
    
                ...
    
                services.AddSingleton<IGraphService, GraphService>();
            })
            .Build();
    }
    
    • Dieser Code erstellt ein GraphServiceClient Objekt, das zum Aufrufen von Microsoft Graph aus Azure Functions verwendet werden kann. Es ist ein Singleton und kann in andere Klassen eingefügt werden.
    • Sie können Microsoft Graph-API-Aufrufe mit Nur-App-Berechtigungen (z. B. Calendars.ReadWrite) ausführen, indem Sie einen ClientSecretCredential Wert an den GraphServiceClient Konstruktor übergeben. Das ClientSecretCredential verwendet die Werte Tenant Id, Client Id und Client Secret aus der Microsoft Entra ID-App.
  5. Öffnen Sie Dienste/GraphService.cs.

  6. Nehmen Sie sich einen Moment Zeit, um die CreateMeetingEventAsync Methode zu erkunden:

    using System;
    using System.Threading.Tasks;
    using Microsoft.Graph;
    using Microsoft.Extensions.Configuration;
    
    namespace GraphACSFunctions.Services;
    
    public class GraphService : IGraphService
    {
        private readonly GraphServiceClient _graphServiceClient;
        private readonly IConfiguration _configuration;
    
        public GraphService(GraphServiceClient graphServiceClient, IConfiguration configuration)
        {
            _graphServiceClient = graphServiceClient;
            _configuration = configuration;
        }
    
        public async Task<string> CreateMeetingAsync()
        {
            var userId = _configuration.GetValue<string>("USER_ID");
            var newMeeting = await _graphServiceClient
                .Users[userId]
                .Calendar
                .Events
                .PostAsync(new()
                {
                    Subject = "Customer Service Meeting",
                    Start = new()
                    {
                        DateTime = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss"),
                        TimeZone = "UTC"
                    },
                    End = new()
                    {
                        DateTime = DateTime.UtcNow.AddHours(1).ToString("yyyy-MM-ddTHH:mm:ss"),
                        TimeZone = "UTC"
                    },
                    IsOnlineMeeting = true
                });
            return newMeeting.OnlineMeeting.JoinUrl;
        }
    }
    
    • GraphServiceClient und IConfiguration Objekte werden in den Konstruktor eingefügt und Feldern zugewiesen.
    • Die CreateMeetingAsync() Funktion sendet Daten an die Microsoft Graph-Kalenderereignisse-API, die dynamisch ein Ereignis im Kalender eines Benutzers erstellt und die Verknüpfungs-URL zurückgibt.
  7. Öffnen Sie TeamsMeetingFunctions.cs , und nehmen Sie sich einen Moment Zeit, um den Konstruktor zu untersuchen. Die zuvor angesehene GraphServiceClient wird injiziert und dem _graphService-Feld zugewiesen.

    private readonly IGraphService _graphService;
    
    public TeamsMeetingFunction(IGraphService graphService) => _graphService = graphService;
    
  8. Suchen Sie die Run Methode:

    [Function("HttpTriggerTeamsUrl")]
    public async Task<HttpResponseData> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequestData req,
        ILogger log)
    {
        var response = req.CreateResponse(HttpStatusCode.OK);
        await response.WriteStringAsync(await _graphService.CreateMeetingAsync());
        return response;
    }
    
    • Er definiert den Funktionsnamen HttpTriggerTeamsUrl, der mit einer HTTP-GET-Anforderung aufgerufen werden kann.
    • Es ruft _graphService.CreateMeetingAsync() auf, wodurch ein neues Ereignis erstellt wird und die Teilnahme-URL zurückgegeben wird.
  9. Führen Sie das Programm aus, indem Sie in Visual Studio F5 drücken oder "Debuggen" auswählen .> Starten Sie das Debuggen über das Menü. Diese Aktion startet das Azure Functions-Projekt und stellt den ACSTokenFunction Aufruf zur Verfügung.

Hinweis

Wenn Sie VS Code verwenden, können Sie ein Terminalfenster im Ordner "GraphACSFunctions" öffnen und ausführen func start. Dabei wird davon ausgegangen, dass die Azure Functions Core Tools auf Ihrem Computer installiert sind.

Aufrufen der Azure-Funktion aus React

  1. Nachdem die httpTriggerTeamsUrl Funktion nun einsatzbereit ist, rufen wir sie aus der React-App auf.

  2. Erweitern Sie den Client-/React-Ordner .

  3. Fügen Sie dem Ordner eine env-Datei mit den folgenden Werten hinzu:

    REACT_APP_TEAMS_MEETING_FUNCTION=http://localhost:7071/api/httpTriggerTeamsUrl
    REACT_APP_ACS_USER_FUNCTION=http://localhost:7071/api/httpTriggerAcsToken
    

    Diese Werte werden während der Erstellung an React übergeben, sodass Sie sie während des Erstellungsprozesses ganz einfach ändern können.

  4. Öffnen Sie die Datei "client/react/App.tsx " in VS Code.

  5. Suchen Sie die teamsMeetingLink Statusvariable in der Komponente. Entfernen Sie den hartcodierten Teams-Link, und ersetzen Sie ihn durch leere Anführungszeichen:

    const [teamsMeetingLink, setTeamsMeetingLink] = useState<string>('');
    
  6. Suchen Sie die useEffect Funktion, und ändern Sie sie so, dass sie wie folgt aussieht. Dadurch wird das Aufrufen der Azure-Funktion behandelt, die Sie zuvor betrachtet haben, wodurch eine Teams-Besprechung erstellt wird und der Link zum Teilnehmen an der Besprechung zurückgegeben wird:

    useEffect(() => {
        const init = async () => {
            /* Commenting out for now
            setMessage('Getting ACS user');
            //Call Azure Function to get the ACS user identity and token
            const res = await fetch(process.env.REACT_APP_ACS_USER_FUNCTION as string);
            const user = await res.json();
            setUserId(user.userId);
            setToken(user.token);
            */
    
            setMessage('Getting Teams meeting link...');
            //Call Azure Function to get the meeting link
            const resTeams = await fetch(process.env.REACT_APP_TEAMS_MEETING_FUNCTION as string);
            const link = await resTeams.text();
            setTeamsMeetingLink(link);
            setMessage('');
            console.log('Teams meeting link', link);
    
        }
        init();
    
    }, []);
    
  7. Speichern Sie die Datei, bevor Sie fortfahren.

  8. Öffnen Sie ein Terminalfenster, wechseln Sie in den Ordner *react, und führen Sie den Befehl cd aus, um die Anwendung zu erstellen und auszuführen.

  9. Nachdem die Anwendung erstellt und geladen wurde, sollte die ACS-Anrufbenutzeroberfläche angezeigt werden, und Sie können dann an der Teams-Besprechung teilnehmen, die dynamisch von Microsoft Graph erstellt wurde.

  10. Beenden Sie den Terminalprozess, indem Sie STRG+C in das Terminalfenster eingeben.

  11. Beenden Sie das Azure Functions-Projekt.

Nächster Schritt

Hinweis

Besuchen Sie die Dokumentation zu Azure Communication Services, um mehr über das Erweitern von Microsoft Teams-Besprechungen auf andere Weise zu erfahren.