Partager via


Utilisation d’API d’entreprise sécurisées avec Azure AD dans SharePoint Framework

Cet article explique comment se connecter à partir d’une solution SharePoint Framework à une API d’entreprise sécurisée avec Azure Active Directory. Il décrit la création et la sécurisation de l’API, ainsi que la création de la solution SharePoint Framework.

Créer une API d’entreprise sécurisée avec Azure AD

Commencez par créer une API d’entreprise sécurisée avec Azure Active Directory. S’il n’existe aucune restriction quand à la façon d’implémenter l’API côté SharePoint Framework, dans le cadre de ce didacticiel, vous allez créer l’API à l’aide d’Azure Functions et la sécuriser à l’aide d’une authentification Azure App Service.

Votre organisation a probablement déjà des API spécifiques qui exposent ses applications, et cette section a pour objectif de donner un aperçu complet des étapes d’implémentation et de configuration.

Créer une fonction Azure

Dans le portail Azure, créez une Function App.

Pour plus d’informations sur la création d’applications de fonction dans Azure, consultez l’article d’aide Créer une Function App à l’aide du Portail Azure.

Dans la Function App, vous allez créer une fonction déclenchée via HTTP. Dans cet exemple, vous allez créer la fonction en C#. Toutefois, en règle générale, vous pouvez utiliser le langage de programmation de votre choix.

Dans Function App, appuyez sur le bouton Nouvelle fonction :

Bouton « Créer » mis en évidence sur le portail Azure

Dans la liste des modèles, sélectionnez Déclencheur HTTP :

Modèle de fonction « Déclencheur HTTP » mis en évidence sur le portail Azure

Dans le panneau Nouvelle fonction, spécifiez le nom de la fonction, définissez Niveau d’autorisation sur Anonyme, puis cliquez sur le bouton Créer :

Paramètres pour la nouvelle fonction Azure sur le portail Azure

Les fonctions Azure peuvent être sécurisées de différentes façons. Étant donné que vous souhaitez sécuriser la fonction via Azure AD, au lieu de sécuriser la fonction elle-même, vous allez sécuriser la Function App sous-jacente. C’est pourquoi, à ce stade, vous décidez de ne pas sécuriser la fonction elle-même. Les paramètres d’authentification appliqués à la Function App s’appliquent à toutes les fonctions à l’intérieur de cette application.

Une fois la fonction créée, remplacez son contenu par l’extrait de code suivant :

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    return (ActionResult)new OkObjectResult(new List<object> {
        new {
            Id = 1,
            OrderDate = new DateTime(2016, 1, 6),
            Region = "east",
            Rep = "Jones",
            Item = "Pencil",
            Units = 95,
            UnitCost = 1.99,
            Total = 189.05
        },
        new {
            Id = 2,
            OrderDate = new DateTime(2016, 1, 23),
            Region = "central",
            Rep = "Kivell",
            Item = "Binder",
            Units = 50,
            UnitCost = 19.99,
            Total = 999.50
        },
        new {
            Id = 3,
            OrderDate = new DateTime(2016, 2, 9),
            Region = "central",
            Rep = "Jardine",
            Item = "Pencil",
            Units = 36,
            UnitCost = 4.99,
            Total = 179.64
        },
        new {
            Id = 4,
            OrderDate = new DateTime(2016, 2, 26),
            Region = "central",
            Rep = "Gill",
            Item = "Pen",
            Units = 27,
            UnitCost = 19.99,
            Total = 539.73
        },
        new {
            Id = 5,
            OrderDate = new DateTime(2016, 3, 15),
            Region = "west",
            Rep = "Sorvino",
            Item = "Pencil",
            Units = 56,
            UnitCost = 2.99,
            Total = 167.44
        }
    });
}

Vérifiez que la fonction opère correctement en appuyant sur le bouton Enregistrer et exécuter :

Bouton « Enregistrer et exécuter » mis en évidence sur le portail Azure

Si la fonction a été exécutée correctement, l’étiquette OK (code d’état HTTP : 200) et la liste de commandes s’affichent dans le volet de test.

Sécuriser la fonction Azure

À présent que la fonction Azure est opérationnelle, l’étape suivante consiste à la sécuriser avec Azure Active Directory de façon à ce que soyez obligé de vous connecter avec le compte de votre organisation pour pouvoir y accéder.

Dans le volet latéral du panneau Function Apps, sélectionnez la Function App :

Function App mise en évidence dans le volet latéral du panneau Function Apps sur le portail Azure

Dans la section supérieure, accédez à l’onglet Fonctionnalités de la plateforme :

Onglet « Fonctionnalités de la plateforme » mis en évidence dans le panneau Function Apps sur le portail Azure

Ensuite, dans le groupe Mise en réseau, sélectionnez le lien Authentification / Autorisation :

Lien « Authentification / Autorisation » mis en évidence dans le panneau Function Apps sur le portail Azure

Dans le panneau Authentification / Autorisation, activez l’authentification App Service en mettant le bouton bascule Authentification App Service en position Activé :

Position « Activé » du bouton bascule « Authentification App Service » mise en évidence dans les paramètres d’authentification de la Function App sur le portail Azure

Dans le menu déroulant Action à exécuter quand une demande n’est pas authentifiée, sélectionnez Se connecter avec Azure Active Directory. Ce paramétrage garantit que des demandes anonymes adressées à l’API ne seront pas autorisées :

L’option « Se connecter avec Azure Active Directory » est mise en évidence dans le menu déroulant « Action à exécuter quand une demande n’est pas authentifiée » sur le panneau des paramètres d’authentification Function App

Ensuite, dans la liste des fournisseurs d’authentification, sélectionnez Azure Active Directory :

« Azure Active Directory » mis en évidence dans la liste des fournisseurs d’authentification pour une Function App

Dans le panneau Paramètres d’Azure Active Directory, définissez l’option Mode d’administration sur Express. Définissez la deuxième option Mode d’administration sur Créer une application AD :

Panneau Paramètres Azure Active Directory ouvert pour une Function App sur le portail Azure

Importante

Avant de poursuivre, notez la valeur figurant dans le champ Créer une application. Cette valeur est le nom de l’application Azure AD que vous allez utiliser pour sécuriser l’API. Vous en aurez besoin plus tard pour demander des autorisations d’accès à l’API à partir du projet SharePoint Framework.

Confirmez votre choix en appuyant sur le bouton OK.

Dans le panneau Authentification / Autorisation, mettez à jour les paramètres d’authentification et d’autorisation de la Function App en appuyant sur le bouton Enregistrer :

Bouton « Enregistrer » mis en évidence dans le panneau « Authentification / Autorisation » pour une Function App sur le portail Azure

Vérifiez que l’API est correctement sécurisée en ouvrant une nouvelle fenêtre de navigateur en mode privé, puis en accédant à l’API. L’URL de votre Function App figure dans la section Vue d’ensemble du panneau Function App. Si les paramètres d’authentification ont été correctement appliqués, vous devriez être redirigé vers la page de connexion à Azure AD :

Page de connexion à Azure AD

Obtenir l’ID d’une application Azure AD

Pour demander un jeton d’accès pour vous connecter à l’API, vous avez besoin de l’ID de l’application Azure AD utilisé pour sécuriser cette API.

Dans la Function App, accédez aux paramètres d’Authentification. Si le lien Authentification n’est pas disponible sous l’en-tête Fonctionnalités configurées, appuyez sur le bouton Actualiser en regard de la Function App dans le volet gauche :

Lien « Authentification » mis en évidence sur la page Function Apps

Dans la liste des fournisseurs d’authentification, sélectionnez Azure Active Directory :

« Azure Active Directory » mis en évidence dans la liste des fournisseurs d’authentification de la Function App

Dans le panneau Paramètres Azure Active Directory, appuyez sur le bouton Gérer l’application :

Bouton « Gérer l’application » mis en évidence dans le panneau « Paramètres Azure Active Directory »

Dans le panneau de l’application Azure AD, copiez la valeur de la propriété ID d’application :

Bouton « Copier » en regard de la propriété « ID de l’application » mis en évidence dans le panneau de l’application Azure AD

Activation de CORS

La Function App sera appelée du JavaScript exécuté sur une page SharePoint. Étant donné que l’API est hébergée sur un domaine différent du portail SharePoint, des contraintes de sécurité inter-domaines s’appliqueront à l’appel de l’API. Par défaut, les API implémentées à l’aide d’une Function App Azure ne peuvent pas être appelées à partir d’autres domaines. Vous pouvez modifier cela en ajustant les paramètres CORS de la Function App.

Importante

Si vous authentifiez l’API à l’aide d’un cookie SharePoint Online au lieu d’OAuth, vous ne pouvez pas configurer de paramètres CORS via le portail Azure. Pour que l’authentification fonctionne, vous devez effacer tous les paramètres CORS sur le portail Azure et les spécifier dans votre API.

Dans la Function App, accédez à l’onglet Fonctionnalités de la plateforme.

Dans le groupe API, sélectionnez le lien CORS :

Lien « CORS » mis en évidence sous l’onglet Fonctionnalités de la plateforme de la Function App

Dans la liste des origines autorisées, ajoutez l’URL de votre client SharePoint, par exemple, https://contoso.sharepoint.com :

URL du client SharePoint ajouté à la liste des origines autorisées dans les paramètres CORS de la Function App

Confirmez vos changements en appuyant sur le bouton Enregistrer.

Utiliser l’API d’entreprise sécurisée avec Azure AD à partir de SharePoint Framework

Une fois l’API configurée et fonctionnelle, l’étape suivante consiste à créer la solution SharePoint Framework qui l’utilisera.

Avant de continuer, vérifiez que vous avez installé la version 1.4.1 ou une version ultérieure du générateur Yeoman pour SharePoint Framework. Si vous avez installé le générateur de manière globale, vous pouvez vérifier la version installée en l’exécutant dans la ligne de commande : npm ls -g --depth=0.

Créer un projet SharePoint Framework

Ensuite, vous allez créer un projet SharePoint Framework pour utiliser l’API.

Dans la ligne de commande, créez un dossier pour votre projet :

md contoso-api

Modifiez le répertoire de travail :

cd contoso-api

Pour créer un projet, lancez le générateur Yeoman pour SharePoint Framework :

yo @microsoft/sharepoint

Lorsque vous y êtes invité, utilisez les valeurs suivantes :

  • Quel est le nom de votre solution ? contoso-api
  • Quels packages de base voulez-vous cibler pour vos composants ? SharePoint Online uniquement (dernière version)
  • Où souhaitez-vous placer les fichiers ? Utilisez le dossier actuel
  • Voulez-vous autoriser l’administrateur client à choisir de pouvoir déployer la solution sur tous les sites immédiatement sans exécuter de déploiement de fonctionnalité ni ajouter d’applications sur les sites. Oui
  • Les composants de la solution nécessiteront-ils des autorisations pour accéder aux API web qui sont uniques et qui ne sont pas partagées avec d'autres composants du client ? Non
  • Quel type de composant côté client créer? Composant WebPart
  • Quel est le nom de votre composant WebPart ? Commandes
  • Quelle est la description de votre composant WebPart ? Afficher les commandes récentes
  • Quelle infrastructure voulez-vous utiliser ? Aucune infrastructure JavaScript

Une fois le projet créé, ouvrez-le dans un éditeur de code. Dans ce didacticiel, vous allez utiliser Visual Studio Code :

Projet SharePoint Framework ouvert dans Visual Studio Code

Demander des autorisations d’accès à l’API d’entreprise

Par défaut, SharePoint Framework n’a pas accès aux API d’entreprise, même si celles-ci sont inscrites dans le même annuaire Azure Active Directory qu’Office 365. Cette approche permet aux organisations de choisir consciemment les API qui doivent être exposées à des scripts et à des solutions côté client déployés sur SharePoint. Pour accéder à vos API d’entreprise, vous devez émettre une demande d’autorisation à partir du projet SharePoint Framework que vous créez.

Dans l’éditeur de code, ouvrez le fichier config/package-solution.json :

Fichier de solution de package ouvert dans Visual Studio Code

À la propriété solution, ajoutez une nouvelle propriété nommée webApiPermissionRequests avec une référence à l’application Azure AD utilisée pour sécuriser votre API :

{
  "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/package-solution.schema.json",
  "solution": {
    "name": "contoso-api-client-side-solution",
    "id": "8cbc01fb-bab6-48fc-afec-2c2053759771",
    "version": "1.0.0.0",
    "includeClientSideAssets": true,
    "skipFeatureDeployment": true,
    "isDomainIsolated": false,
    "webApiPermissionRequests": [
      {
        "resource": "contoso-api-dp20191109",
        "scope": "user_impersonation"
      }
    ]
  },
  "paths": {
    "zippedPackage": "solution/contoso-api.sppkg"
  }
}

La valeur de la propriété resource fait référence au nom de l’application Azure AD utilisée pour sécuriser l’API. La valeur de la propriété scope indique l’étendue de l’autorisation nécessaire à votre solution pour communiquer avec l’API. Dans ce didacticiel, Azure AD est utilisé uniquement pour sécuriser l’API, donc user_impersonation est l’étendue que vous utiliserez.

Remarque

Si vous souhaitez vous connecter à une API d’entreprise qui a été créée précédemment, contactez votre administrateur pour obtenir des détails sur l’application Azure AD utilisée pour la sécuriser. Vous aurez besoin d’informations telles que l’ID d’application, les autorisations que l’application expose et l’audience pour laquelle elle est configurée.

Se connecter à l’API d’entreprise

Cette dernière partie a trait à l’implémentation de la connexion réelle à l’API d’entreprise.

Dans l’éditeur de code, ouvrez le fichier src\webparts\orders\OrdersWebPart.ts :

Fichier OrdersWebPart.ts ouvert dans Visual Studio Code

Dans la section supérieure du fichier, référencez les classes AadHttpClient et HttpClientResponse en ajoutant l’extrait de code suivant :

import { AadHttpClient, HttpClientResponse } from '@microsoft/sp-http';

Ajoutez une nouvelle variable de classe nommée ordersClient à la classe OrdersWebPart :

export default class OrdersWebPart extends BaseClientSideWebPart<IOrdersWebPartProps> {
  private ordersClient: AadHttpClient;

  // shortened for brevity
}

Ensuite, dans la classe OrdersWebPart, remplacez la méthode onInit() pour créer une instance de la classe AadHttpClient :

export default class OrdersWebPart extends BaseClientSideWebPart<IOrdersWebPartProps> {
  private ordersClient: AadHttpClient;

  protected onInit(): Promise<void> {
    return new Promise<void>((resolve: () => void, reject: (error: any) => void): void => {
      this.context.aadHttpClientFactory
        .getClient('6bc8bca8-5866-405d-b236-9200bdbb73c0')
        .then((client: AadHttpClient): void => {
          this.ordersClient = client;
          resolve();
        }, err => reject(err));
    });
  }

  // shortened for brevity
}

Le GUID transmis en tant que deuxième paramètre du constructeur AadHttpClient est l’ID de l’application Azure AD utilisée pour sécuriser l’API d’entreprise.

Pour finir, étendez la méthode render() pour charger et afficher les commandes récupérées de l’API d’entreprise :

export default class OrdersWebPart extends BaseClientSideWebPart<IOrdersWebPartProps> {
  private ordersClient: AadHttpClient;

  protected onInit(): Promise<void> {
    return new Promise<void>((resolve: () => void, reject: (error: any) => void): void => {
      this.context.aadHttpClientFactory
        .getClient('6bc8bca8-5866-405d-b236-9200bdbb73c0')
        .then((client: AadHttpClient): void => {
          this.ordersClient = client;
          resolve();
        }, err => reject(err));
    });
  }

  public render(): void {
    this.context.statusRenderer.displayLoadingIndicator(this.domElement, 'orders');

    this.ordersClient
      .get('https://contoso-api-dp20191109.azurewebsites.net/api/Orders', AadHttpClient.configurations.v1)
      .then((res: HttpClientResponse): Promise<any> => {
        return res.json();
      })
      .then((orders: any): void => {
        this.context.statusRenderer.clearLoadingIndicator(this.domElement);
        this.domElement.innerHTML = `
          <div class="${ styles.orders}">
            <div class="${ styles.container}">
              <div class="${ styles.row}">
                <div class="${ styles.column}">
                  <span class="${ styles.title}">Orders</span>
                  <p class="${ styles.description}">
                    <ul>
                      ${orders.map(o => `<li>${o.rep} $${o.total}</li>`).join('')}
                    </ul>
                  </p>
                  <a href="https://aka.ms/spfx" class="${ styles.button}">
                    <span class="${ styles.label}">Learn more</span>
                  </a>
                </div>
              </div>
            </div>
          </div>`;
      }, (err: any): void => {
        this.context.statusRenderer.renderError(this.domElement, err);
      });
  }

  // shortened for brevity
}

Déployer la solution vers le catalogue d’applications SharePoint

Une fois la solution SharePoint Framework implémentée, il s’agit de la déployer vers SharePoint.

Commencez par créer le projet et générer un package en exécutant la ligne de commande suivante :

gulp bundle --ship && gulp package-solution --ship

Ensuite, dans l’Explorateur de fichiers, ouvrez le dossier du projet, puis accédez au dossier sharepoint/solution :

Dossier du projet « sharepoint/solution » ouvert dans le Finder macOS

À l’aide de votre navigateur web, accédez au catalogue d’applications client dans votre locataire Office 365 :

Catalogue d’applications client affiché dans un navigateur web

Ajoutez le fichier .sppkg généré en le glissant-déplaçant de l’Explorateur vers le catalogue d’applications client :

Fenêtre contextuelle du Finder macOS présentant le catalogue d’applications client

Lorsque vous y êtes invité, activez la case à cocher Rendre cette solution disponible pour tous les sites dans l’organisation. Notez également la remarque indiquant que vous devez accéder à la page de gestion des autorisations du principal du service pour approuver les demandes d’autorisation en attente. Confirmez le déploiement en sélectionnant le bouton Déployer.

Octroyer l’accès à l’API d’entreprise

Dans le navigateur web, accédez au site administrateur du client en sélectionnant l’option Administrateur dans le lanceur d’applications Office 365 :

Option « Administrateur » mise en évidence dans le menu du lanceur d’applications Office 365

Dans le menu, dans le groupe Centres d’administration, sélectionnez SharePoint :

Option « SharePoint » mise en évidence dans le menu du Centre d’administration Office 365

Dans le Centre d’administration SharePoint, accédez au nouvel aperçu du Centre d’administration SharePoint en suivant le lien permettant d’essayer le nouvel aperçu du Centre d’administration SharePoint :

Lien « Try the new SharePoint admin center » (Essayer le nouveau Centre d’administration SharePoint) mis en évidence dans le Centre d’administration SharePoint

Dans le menu du nouveau Centre d’administration, sélectionnez l’option Gestion des API :

Option « Gestion des API » mise en évidence dans le menu du nouveau Centre d’administration SharePoint

Dans la page de gestion des API, dans le groupe Approbation en attente, sélectionnez la demande d’autorisation nouvellement ajoutée pour accéder à l’API contoso-api (le nom de votre API s’affiche) :

Bouton Sélectionner en regard d’une demande d’autorisation mis en évidence sur la page de gestion des API dans le nouveau Centre d’administration SharePoint

Ensuite, dans la barre d’outils, appuyez sur le bouton Approve or reject (Approuver ou rejeter) :

Option « Approuver ou rejeter » (Approuver ou rejeter) mise en évidence dans la barre d’outils de la page de gestion des API du nouveau Centre d’administration SharePoint

Dans le panneau latéral, accordez l’accès à l’API en appuyant sur le bouton Approuver :

Bouton « Approuver » mis en évidence dans le panneau latéral pour la gestion d’une demande d’API dans le nouveau Centre d’administration SharePoint

Remarque

Il est possible de créer un composant WebPart isolé du domaine qui se connecte à l’API sécurisée avec AAD. Dans ce cas, le CORS de l’API doit être reconfiguré de façon appropriée, car chaque instance de composant WebPart isolé du domaine s’exécute dans une application web dédiée avec un domaine unique.

Ajouter le composant WebPart Commandes à la page

Pour vérifier que tout fonctionne comme prévu, ajoutez à la page le composant WebPart Commandes créé précédemment.

Dans le navigateur web, accédez à un site dans votre locataire. Dans la barre d’outils, sélectionnez l’option Modifier :

Bouton « Modifier » mis en évidence dans la barre d’outils d’un site d’équipe moderne

Dans le canevas, sélectionnez une section à laquelle ajouter le composant WebPart :

Section de page mise en évidence dans le navigateur web

Activez l’option + pour ouvrir la boîte à outils. Dans la zone de recherche, tapez Commandes pour rechercher rapidement le composant WebPart Commandes :

« Commandes » tapées dans la boîte à outils. Composant WebPart Commandes affiché dans la boîte à outils

Sélectionnez le composant WebPart Commandes pour l’ajouter à la page. Vous devriez voir la liste des commandes récupérées à partir de l’API d’entreprise :

Liste des commandes récentes récupérées à partir d’une API d’entreprise affichée dans une page SharePoint

Si vous voyez s’afficher le message d’erreur « Failed to open pop-up window » (Échec de l’ouverture de la fenêtre contextuelle), cela signifie qu’un bloqueur de fenêtres publicitaires est activé. Pour afficher la page correctement, vous devez désactiver le bloqueur de fenêtres publicitaires du navigateur pour votre site.