Guide étape par étape pour déployer AccessPoint dans votre environnement Microsoft 365 et Azure

Last updated: September 03, 2026 by Steve

Guide de déploiement

AccessPoint utilise un modèle de déploiement fractionné : un composant web SPFx léger dans SharePoint, une application Teams qui héberge ce même composant web comme onglet personnel, et un backend Azure qui exécute l'API et stocke toutes les données. Chaque composant est déployé dans votre propre locataire Microsoft 365 et votre propre abonnement Azure — rien n'est hébergé par l'éditeur, et aucune donnée client ne quitte votre environnement.

Aperçu

Composant Où l'obtenir Emplacement de déploiement
Composant web SPFx (accesspoint.sppkg) Microsoft AppSource ou téléversement direct dans votre catalogue d'applications Votre locataire SharePoint Online
Application Teams (accesspoint-teams.zip) Microsoft AppSource ou téléversement dans le Centre d'administration Teams Votre catalogue d'applications Teams
Backend Azure (App Service, SQL, Blob Storage, Application Insights, ainsi que les ressources facultatives d'IA, de recherche, d'OCR, de synthèse vocale, d'analyse antivirus et de traitement média) Modèle Bicep/ARM en un clic depuis le portail Azure (recommandé) ou Bicep scripté + PowerShell Votre abonnement Azure

Pour les clouds souverains/gouvernementaux, l'épinglage de version ou les déploiements scriptés, tous les artefacts sont également publiés à l'adresse https://get.realizer.io/public/accesspoint/latest/.

L'ordre d'installation compte. Installez la solution SharePoint avant qu'un utilisateur n'ouvre l'onglet personnel Teams. L'application Teams charge le composant web SPFx depuis SharePoint dans un iframe — sans cela, les utilisateurs voient une erreur 404 SharePoint à l'intérieur de Teams.

Prérequis

  • Un abonnement AccessPoint actif (obtenir AccessPoint) — l'API active automatiquement sa licence à l'aide de son identité Entra, de sorte qu'aucune clé de licence n'est nécessaire, sauf si le soutien Realizer vous en fournit une pour votre locataire
  • Un abonnement Azure avec des droits Contributeur (ou supérieurs) sur le groupe de ressources cible
  • Un catalogue d'applications SharePoint provisionné dans votre locataire, ainsi que des droits Administrateur SharePoint
  • Administrateur général ou Administrateur d'application dans Entra ID pour l'octroi des autorisations Graph et le consentement de l'administrateur
  • Administrateur Teams (ou administrateur général) pour publier l'application Teams
  • Pour les déploiements scriptés ou manuels : Azure CLI (connecté avec az login en tant qu'utilisateur, et non en tant que principal de service) et le module PnP.PowerShell

Il n'existe aucune dépendance à un niveau de licence Microsoft 365, à Power Platform ou à Dataverse — tout utilisateur ayant accès à SharePoint ou à Teams peut utiliser AccessPoint.

Étape 1 : Déployer les ressources Azure

Cette étape provisionne le backend : un App Service Linux (l'API), une base de données Azure SQL, un espace Blob Storage et Application Insights avec Log Analytics. Les ressources sont nommées {type}-accesspoint-{tenantName} (par exemple, app-accesspoint-contoso) et sont durcies par défaut (TLS 1.3, authentification SQL Entra uniquement, FTPS et authentification de base désactivés, Microsoft Defender pour SQL activé par défaut). Le serveur SQL est créé d'emblée en authentification Entra : l'utilisateur qui effectue le déploiement devient l'administrateur Entra initial et aucun identifiant SQL n'existe jamais — il n'y a rien à faire pivoter ni à désactiver.

Option A : Portail Azure (recommandé). Déployez le modèle Bicep/ARM d'AccessPoint en un clic depuis le portail Azure (le bouton Déployer sur Azure). Le formulaire de déploiement recueille votre abonnement et votre groupe de ressources, le nom du locataire (par exemple, contoso tiré de contoso.sharepoint.com), ainsi qu'un type de déploiement obligatoire, sans valeur par défaut : choisissez Nouvelle installation pour un premier déploiement, ou Mise à niveau d'une installation existante lors d'un redéploiement par-dessus une instance AccessPoint déjà en service — la posture de mise à niveau préserve les paramètres d'application ajoutés par l'opérateur et laisse l'accès à la base de données intact. Choisissez éventuellement un SKU d'App Service (B1 pour l'évaluation, S1 pour la production standard, P1v3 par défaut; P2v3 lorsque les enregistrements seront transcodés en cours de traitement sans le module de traitement média), une adresse courriel d'alerte, ainsi que les capacités facultatives ci-dessous. Laissez la clé API de licence vide — AccessPoint active automatiquement sa licence à l'aide de l'identité Entra de l'application; ne saisissez une valeur que si le soutien Realizer vous en fournit une pour votre locataire. Le paquet de l'API se déploie automatiquement dans l'App Service — après le déploiement, il n'existe aucune dépendance d'exécution envers des services externes.

Terminer la configuration (autorisations Graph). Le modèle lui-même n'accorde jamais les autorisations Graph. Après le déploiement, ouvrez le lien finishSetupUrl depuis les sorties (Outputs) du déploiement et connectez-vous en tant qu'administrateur général — la page Terminer la configuration de l'éditeur accorde en une seule passe idempotente toutes les autorisations Graph dont l'identité managée a besoin. Revisitez le même lien après une mise à niveau pour récupérer les autorisations nouvellement introduites. Effectuez ensuite un cycle complet d'arrêt/démarrage de l'App Service (pas un redémarrage) pour que les autorisations prennent effet.

Déploiement du modèle Bicep/ARM d'AccessPoint dans le portail Azure

Option B : Bicep + PowerShell. Pour les pipelines personnalisés ou un contrôle des changements strict, exécutez le script de déploiement à partir du modèle ARM publié :

Invoke-WebRequest -Uri "https://get.realizer.io/public/accesspoint/latest/Deploy-AccessPoint.ps1" -OutFile "Deploy-AccessPoint.ps1"

# End-to-end: infrastructure, configuration, and both apps
.\Deploy-AccessPoint.ps1 `
    -SharePointSiteUrl "https://contoso.sharepoint.com/sites/accesspoint" `
    -TemplateUri "https://get.realizer.io/public/accesspoint/latest/main.json" `
    -DeploySharePointApp -DeployTeamsApp

Le script détecte automatiquement le type de déploiement (nouvelle installation ou mise à niveau) et exécute jusqu'à sept étapes — infrastructure, authentification SQL Entra uniquement (une mesure de repli : les modèles actuels créent le serveur d'emblée en authentification Entra), octroi des autorisations Graph (l'équivalent scripté de la page Terminer la configuration), un cycle d'arrêt/démarrage de l'App Service, l'entité de stockage SharePoint facultative (URL de l'API), l'approbation des autorisations API du SPFx et l'installation facultative des applications. Chacune peut être omise indépendamment (-SkipInfrastructure, -SkipGraphPermissions, -SkipSharePoint). Épinglez une version avec -ArtifactBaseUrl "https://get.realizer.io/public/accesspoint/2.1.0" pour des déploiements reproductibles et à intégrité vérifiée (le script vérifie le SHA-256 publié et s'interrompt en cas de non-correspondance).

Pour exécuter vous-même les éléments d'infrastructure :

$TenantName    = "contoso"
$ResourceGroup = "rg-accesspoint-$TenantName"

az group create --name $ResourceGroup --location "canadacentral"

$deployment = az deployment group create `
    --resource-group $ResourceGroup `
    --template-uri "https://get.realizer.io/public/accesspoint/latest/main.json" `
    --parameters tenantName=$TenantName appServiceSku=P1v3 `
    --output json | ConvertFrom-Json

$appName     = $deployment.properties.outputs.appServiceName.value
$apiUrl      = $deployment.properties.outputs.appServiceUrl.value
$principalId = $deployment.properties.outputs.appServicePrincipalId.value

# Backstop only: current templates create the SQL server Entra-first, so
# Entra-only auth is already in force and no SQL credential ever exists
az sql server ad-only-auth enable --resource-group $ResourceGroup `
    --server-name $deployment.properties.outputs.sqlServerName.value

Octroi des autorisations Graph. L'identité managée de l'App Service a besoin des autorisations d'application Microsoft Graph suivantes : Mail.Send, User.ReadBasic.All, TeamsAppInstallation.ReadForUser.All, Application.Read.All, AppCatalog.Read.All, ainsi que (activée par défaut, avec possibilité de désengagement) AiEnterpriseInteraction.Read.All pour la capture Copilot. La façon la plus simple consiste à utiliser la page Terminer la configuration — la sortie de déploiement finishSetupUrl — qui accorde toutes ces autorisations en une seule passe idempotente à l'aide de la connexion déléguée d'un administrateur général. Pour les accorder par CLI à la place :

$graphSpId = az ad sp show --id "00000003-0000-0000-c000-000000000000" --query id -o tsv

$permissions = @(
    @{ Name = "Mail.Send";                            Id = "b633e1c5-b582-4048-a93e-9f11b44c7e96" }
    @{ Name = "User.ReadBasic.All";                   Id = "97235f07-e226-4f63-ace3-39588e11d3a1" }
    @{ Name = "TeamsAppInstallation.ReadForUser.All"; Id = "9ce09611-f4f7-4abd-a629-a05450422a97" }
    @{ Name = "Application.Read.All";                 Id = "9a5d68dd-52b0-4cc2-bd40-abcf44ac3a30" }
    @{ Name = "AppCatalog.Read.All";                  Id = "e12dae10-5a57-4817-b79d-dfbec5348930" }
    # Copilot capture (tenant-wide) — granted by default; remove this line to opt out:
    @{ Name = "AiEnterpriseInteraction.Read.All";     Id = "839c90ab-5771-41ee-aef8-a562e8487c1e" }
)

foreach ($perm in $permissions) {
    $bodyFile = [System.IO.Path]::GetTempFileName()
    @{ principalId = $principalId; resourceId = $graphSpId; appRoleId = $perm.Id } |
        ConvertTo-Json | Set-Content -Path $bodyFile -Encoding utf8
    az rest --method POST `
        --uri "https://graph.microsoft.com/v1.0/servicePrincipals/$principalId/appRoleAssignments" `
        --body "@$bodyFile" --headers "Content-Type=application/json" --output none
    Remove-Item $bodyFile
}

# Full stop/start (NOT restart) clears the managed identity token cache
az webapp stop  --name $appName --resource-group $ResourceGroup
Start-Sleep -Seconds 10
az webapp start --name $appName --resource-group $ResourceGroup

Vérification : accédez à https://<api-url>/api/health et confirmez une réponse saine.

Capacités facultatives

Le modèle expose plusieurs capacités facultatives, dont aucune n'est requise pour faire fonctionner AccessPoint. Toutes sont désactivées à moins que vous ne les activiez au moment du déploiement, à l'exception de la permission de capture Copilot, qui est accordée par défaut avec possibilité de désengagement (le formulaire Déployer sur Azure, -p name=value sur az deployment, ou les commutateurs Deploy-AccessPoint.ps1 indiqués ci-dessous permettent de toutes les contrôler). Chaque ressource facultative est déployée dans votre propre abonnement Azure avec une authentification exclusivement par identité managée et l'accès par clé désactivé — aucune donnée client ne quitte votre locataire, et Microsoft n'entraîne pas ses modèles sur celle-ci.

Les capacités facultatives sur le formulaire Déployer sur Azure

  • Déployer l'Assistance IA (Azure OpenAI) — ajoute une ressource Azure OpenAI à votre abonnement, avec authentification par identité managée (sans clés d'API). La facturation se fait à l'utilisation : un locataire inactif paie donc environ 0 $, et un service très actif dépense généralement quelques dollars par mois (un montant à un chiffre). Son déploiement active les fonctionnalités de l'Assistance IA, chacune pouvant être activée ou désactivée individuellement sous Paramètres > Fonctionnalités. Chaque sortie de l'IA est une suggestion ou un brouillon modifiable — c'est toujours une personne qui décide.

  • Déployer AI Search (deployAiSearch=true) — ajoute Azure AI Search afin que la zone de recherche des Documents trouve des mots à l'intérieur des documents (texte extrait des PDF), en plus des noms, des types et des étiquettes; lorsque l'Assistance IA est également déployée, elle prend en charge la recherche sémantique. Les nouveaux documents sont indexés automatiquement, et un balayage effectué par un administrateur (Paramètres > Configuration > Recherche dans le contenu des documents) indexe ceux qui lui sont antérieurs.

  • Déployer Document Intelligence (deployDocumentIntelligence=true) — ajoute Azure AI Document Intelligence pour l'OCR : les documents numérisés composés uniquement d'images voient leur texte extrait, de sorte qu'ils participent à la recherche dans le contenu, à la détection des doublons, aux résumés générés par l'IA et aux suggestions de caviardage, comme tout autre document. Il alimente aussi la détection du texte à l'écran dans les vidéos (les images échantillonnées sont lues de la même façon, facturées par image). La facturation se fait à la page (environ 1,50 $US pour 1 000 pages). Sans cela, les documents numérisés continuent de correspondre par nom, type et étiquette.

  • Déployer Speech (deploySpeech=true) — ajoute Azure AI Speech pour les transcriptions et sous-titres des enregistrements vidéo et audio : horodatés, avec identification des locuteurs, alimentant la recherche dans la transcription, la recherche de contenu, la détection des doublons, l'ancrage de l'IA et les propositions de caviardage ancrées à la transcription. Le compte Speech lit l'audio par l'entremise de sa propre identité managée — aucun jeton d'accès partagé n'est émis. La facturation se fait à l'heure audio (environ 0,18 $US) et est d'environ 0 $ au repos.

  • Déployer Defender for Storage (deployDefenderForStorage=true) — active l'analyse antivirus au téléversement de Microsoft Defender for Storage sur le compte de documents. L'API reflète chaque verdict sur le document et bloque l'aperçu, la lecture, le téléchargement et la divulgation de tout élément signalé, ce qui fait de l'analyse un élément du contrôle de divulgation pour les fichiers natifs divulgués tels quels. Facturé au Go analysé, plafonné par malwareScanCapGBPerMonth (5 000 par défaut).

  • Déployer le traitement média (deployMediaProcessing=true) — l'exécuteur média à l'échelle de la production : deux Storage Queues et une tâche Container Apps à mise à l'échelle vers zéro exécutant l'image de travailleur média de l'éditeur, de sorte que les transcodages, les vignettes et le rendu de divulgation quittent l'App Service. La même tâche convertit aussi les documents Office très volumineux et les numérisations. Sans elle, les enregistrements sont traités en cours de traitement sur l'App Service (choisissez P2v3 pour appServiceSku). Facturé à la seconde-vCPU pendant qu'une tâche s'exécute; environ 0 $ au repos. La tâche tire une image de conteneur code seulement — aucune donnée client ne transite jamais par le registre. Pour la production, mettez en miroir l'image dans votre propre Azure Container Registry une fois par version et faites pointer mediaWorkerImage et mediaWorkerRegistryResourceId vers elle, de sorte que les tâches média ne dépendent jamais de l'accessibilité du registre de l'éditeur :

    az acr create --name <yourregistry> --resource-group <rg> --sku Basic
    az acr import --name <yourregistry> --source realizer.azurecr.io/accesspoint/media-worker:<apiVersion> --image accesspoint/media-worker:<apiVersion>
    # deploy with: mediaWorkerImage = <yourregistry>.azurecr.io/accesspoint/media-worker:<apiVersion>
    #              mediaWorkerRegistryResourceId = $(az acr show --name <yourregistry> --query id -o tsv)
    

    Relancez l'importation lors d'une mise à niveau — l'étiquette suit la version de l'API. Les abonnements à sortie réseau restreinte doivent emprunter cette voie.

  • Origine SharePoint (sharePointOrigin=https://contoso.sharepoint.com) — ajoute une règle CORS de blob pour votre origine SharePoint et permet aux enregistrements de se lire directement depuis Blob Storage au moyen de liens de délégation utilisateur d'une heure, plutôt qu'en diffusion continue par l'API, ce qui réduit la sortie réseau de l'App Service. Laissez-la vide sous l'isolation réseau.

  • Permission de capture Copilot (AiEnterpriseInteraction.Read.All) — cette permission Graph à l'échelle du locataire est accordée par défaut, afin que les Custodian puissent capturer l'historique des interactions Copilot d'emblée via Documents > Ajouter depuis Microsoft 365. Les locataires appliquant le principe du moindre privilège peuvent s'en désengager avec -DisableCopilotCapture sur le script de déploiement Deploy-AccessPoint.ps1 (ou grantCopilotCapturePermission=false sur le modèle ARM/Bicep) et peuvent révoquer le rôle d'application dans Entra ID à tout moment. Il s'agit d'une permission d'application uniquement (Microsoft Graph n'offre aucune variante déléguée), mais AccessPoint ne lit jamais que l'historique Copilot de l'utilisateur connecté lui-même; les cinq permissions Graph standard ci-dessus ne sont pas touchées.

Étape 2 : Installer les applications AccessPoint

Installez d'abord la solution SharePoint, puis l'application Teams.

Solution SharePoint. Depuis la fiche AppSource, cliquez sur Get it now et approuvez-la dans votre catalogue d'applications SharePoint, déployée à l'échelle du locataire. Vous pouvez aussi la téléverser manuellement (Centre d'administration SharePoint > Plus de fonctionnalités > Applications > Téléverser, cochez « Rendre cette solution disponible pour tous les sites ») ou laisser le script s'en charger.

Solution AccessPoint dans le catalogue d'applications SharePoint

Application Teams. Depuis la fiche AppSource, cliquez sur Get it now et approuvez-la dans le Centre d'administration Teams, ou installez les deux applications via le script (l'utilisateur connecté doit disposer des droits d'administrateur SharePoint ainsi que d'administrateur Teams ou d'administrateur général) :

.\Deploy-AccessPoint.ps1 `
    -SharePointSiteUrl "https://contoso.sharepoint.com/sites/accesspoint" `
    -SkipInfrastructure -SkipGraphPermissions `
    -DeploySharePointApp -DeployTeamsApp

N'utilisez PAS « Synchroniser vers Teams » de SharePoint. Cette fonction remplace silencieusement le webApplicationInfo.id du manifeste, ce qui casse les notifications du fil d'activité Teams. Téléversez l'application Teams directement dans le Centre d'administration Teams.

Vérification : la solution apparaît dans le catalogue d'applications sans erreur, et AccessPoint s'affiche comme Autorisée dans le Centre d'administration Teams > Gérer les applications.

Étape 3 : Approuver les autorisations API

Le paquet SPFx demande des autorisations déléguées qu'un administrateur SharePoint doit approuver. Dans le Centre d'administration SharePoint, allez dans Avancé > Accès API et approuvez chaque demande AccessPoint en attente : access_as_user sur l'API AccessPoint, ainsi que les portées Graph pour les sélecteurs de personnes et les sources de capture Ajouter depuis Microsoft 365 — User.Read.All, Sites.Read.All, Files.Read.All, Mail.Read et Mail.Read.Shared (boîtes aux lettres propres et partagées/de prise en charge), Calendars.Read et Calendars.Read.Shared, Chat.Read, ChannelMessage.Read.All, Team.ReadBasic.All, Channel.ReadBasic.All (clavardages et canaux Teams), ainsi que Notes.Read et Notes.Read.All (OneNote), et OnlineMeetingRecording.Read.All, OnlineMeetingTranscript.Read.All et OnlineMeetings.Read (enregistrements et transcriptions des réunions Teams organisées par l'utilisateur). Les portées .Shared n'élargissent jamais l'accès à elles seules — Graph continue d'appliquer les permissions Exchange existantes de chaque utilisateur sur sa boîte aux lettres.

Approbation des demandes d'autorisations API AccessPoint

La demande en attente sélectionnée, avec Approuver et Rejeter disponibles

Ou approuvez-les via PnP PowerShell :

Connect-PnPOnline -Url "https://contoso-admin.sharepoint.com" -Interactive

$spfxPermissions = @(
    @{ Resource = "ed19c96c-a7c5-4dca-8b47-0899c406329f"; Scope = "access_as_user" }
    @{ Resource = "Microsoft Graph"; Scope = "User.Read.All" }
    @{ Resource = "Microsoft Graph"; Scope = "Sites.Read.All" }
    @{ Resource = "Microsoft Graph"; Scope = "Files.Read.All" }
    @{ Resource = "Microsoft Graph"; Scope = "Mail.Read" }
    @{ Resource = "Microsoft Graph"; Scope = "Mail.Read.Shared" }
    @{ Resource = "Microsoft Graph"; Scope = "Calendars.Read" }
    @{ Resource = "Microsoft Graph"; Scope = "Calendars.Read.Shared" }
    @{ Resource = "Microsoft Graph"; Scope = "Chat.Read" }
    @{ Resource = "Microsoft Graph"; Scope = "ChannelMessage.Read.All" }
    @{ Resource = "Microsoft Graph"; Scope = "Team.ReadBasic.All" }
    @{ Resource = "Microsoft Graph"; Scope = "Channel.ReadBasic.All" }
    @{ Resource = "Microsoft Graph"; Scope = "Notes.Read" }
    @{ Resource = "Microsoft Graph"; Scope = "Notes.Read.All" }
    @{ Resource = "Microsoft Graph"; Scope = "OnlineMeetingRecording.Read.All" }
    @{ Resource = "Microsoft Graph"; Scope = "OnlineMeetingTranscript.Read.All" }
    @{ Resource = "Microsoft Graph"; Scope = "OnlineMeetings.Read" }
)
foreach ($perm in $spfxPermissions) {
    Grant-PnPTenantServicePrincipalPermission -Scope $perm.Scope -Resource $perm.Resource
}

Finalement, un administrateur général accorde le consentement de l'administrateur pour l'application multilocataire de l'éditeur en ouvrant https://login.microsoftonline.com/common/adminconsent?client_id=ed19c96c-a7c5-4dca-8b47-0899c406329f dans un navigateur.

Vérification : la page d'accès API n'affiche plus aucune demande AccessPoint en attente.

Étape 4 : Utiliser AccessPoint dans SharePoint ou Teams

SharePoint : modifiez ou créez une page, cliquez sur +, recherchez AccessPoint, ajoutez le composant web, puis publiez.

Teams : les utilisateurs trouvent AccessPoint sous Applications > Conçues pour votre organisation (l'indexation de la recherche peut prendre de 15 minutes à plusieurs heures après la première installation). Vous pouvez aussi l'épingler pour tout le monde via Centre d'administration Teams > Stratégies de configuration des applications, en ajoutant AccessPoint aux Applications installées et aux Applications épinglées.

Étape 5 : Configuration de l'URL de l'API (généralement automatique)

Le composant web découvre automatiquement l'URL de l'API. L'API AccessPoint enregistre elle-même son adresse auprès de la plateforme Realizer lorsqu'elle valide sa licence — dans les minutes qui suivent le démarrage de l'App Service — et le composant web la récupère à cet endroit. Dans la plupart des déploiements, il n'y a rien à faire ici.

Vérification : rechargez le composant web — le tableau de bord se charge à la place de l'invite de configuration. Si l'API vient d'être déployée, la découverte réussit au prochain chargement de page, après la première validation de licence réussie.

Configurer l'URL de l'API manuellement (facultatif)

Cette étape n'est nécessaire que pour remplacer la découverte automatique — par exemple, pour épingler le composant web à un domaine personnalisé.

Option A — Panneau Configuration. Ouvrez le composant web, allez dans Paramètres > Configuration, saisissez l'URL de l'API (l'URL de l'App Service issue de l'étape 1, par exemple https://app-accesspoint-contoso.azurewebsites.net), puis cliquez sur Enregistrer. Le panneau valide le format HTTPS avant l'enregistrement, et une URL saisie manuellement a priorité sur la découverte automatique.

Configuration de l'URL de l'API dans le panneau Configuration

Option B — Entité de stockage (PowerShell). Épinglez l'URL dans une entité de stockage AccessPoint_ApiUrl, qui a priorité sur la découverte automatique. Depuis janvier 2026, SharePoint bloque les écritures dans l'ensemble de propriétés (property bag) du catalogue d'applications sans script (centre de messages MC1186368) ; un administrateur SharePoint doit donc les autoriser une seule fois, à l'échelle du locataire, avant que l'entité de stockage puisse être écrite :

# One-time (SharePoint admin): allow property-bag updates on no-script sites
Set-SPOTenant -AllowWebPropertyBagUpdateWhenDenyAddAndCustomizePagesIsEnabled $true

Connect-PnPOnline -Url "https://contoso.sharepoint.com" -Interactive
$appCatalogUrl = Get-PnPTenantAppCatalogUrl
Connect-PnPOnline -Url $appCatalogUrl -Interactive   # storage entities live on the App Catalog site

Set-PnPStorageEntity -Key "AccessPoint_ApiUrl" -Value $apiUrl -Description "AccessPoint API base URL"
Get-PnPStorageEntity -Key "AccessPoint_ApiUrl"       # verify

Étape 6 : Importer un paquet de juridiction

Allez dans Paramètres > Paquets de juridiction, choisissez le paquet correspondant à votre juridiction (Canada ATIA, États-Unis FOIA, UE GDPR, et autres), puis cliquez sur Importer. Le paquet crée des types de demande, des motifs de prolongation, des champs de choix, des modèles de notification et des traductions. Révisez et personnalisez les éléments importés par la suite.

Étape 7 : Attribuer les rôles utilisateur

Le premier utilisateur à ouvrir AccessPoint se voit automatiquement attribuer le rôle Administrateur — le seul rôle intégré, qui résout toujours vers l'ensemble des permissions. Tout autre rôle est défini par le locataire : l'importation d'un paquet de juridiction préremplit des rôles prêts à l'emploi (comme Coordonnateur des demandes, le rôle faisant office d'agent de l'accès et de la protection de la vie privée), que vous pouvez renommer ou remodeler sous Paramètres > Rôles et permissions. Allez dans Paramètres > Gérer les utilisateurs, cliquez sur Ajouter un utilisateur, recherchez dans votre annuaire, puis attribuez au moins un Administrateur et un coordonnateur; les accès Dépositaire, Contributeur, Réviseur et Lecteur découlent automatiquement du travail que vous assignez aux personnes.

AccessPoint est maintenant prêt à l'emploi.

Mise à jour d'AccessPoint

AccessPoint vous avertit lorsqu'une nouvelle version est disponible — il n'y a rien à quoi s'abonner ni à interroger manuellement :

  • Lors de la validation de licence de routine, la Plateforme Realizer signale la dernière version publiée d'AccessPoint (la version la plus récemment promue au canal de diffusion client). Aucune donnée d'utilisation ou de dossier n'intervient dans cette vérification.
  • Lorsque la version publiée est plus récente que celle exécutée par votre API, les administrateurs voient un avis Mise à jour disponible sur le tableau de bord et dans Configuration initiale, indiquant les numéros de version actuelle et la plus récente.
  • Lorsque vous êtes à jour (ou que vous exécutez une version préliminaire plus récente que la version publiée), Configuration initiale affiche « Votre API AccessPoint est à jour. »

Pour appliquer une mise à jour :

  1. Dans Paramètres > Configuration, cliquez sur Déployer la mise à jour sur Azure. Cela ouvre le portail Azure avec le dernier modèle ARM — le même modèle utilisé pour le déploiement initial.
  2. Choisissez le type de déploiement Mise à niveau d'une installation existante. Cela préserve les paramètres d'application ajoutés par l'opérateur et laisse l'accès à la base de données intact; le schéma de la base de données se met à jour automatiquement au démarrage de l'API (migration DacPac).
  3. Mettez à jour le paquet SPFx : téléversez le dernier accesspoint.sppkg dans votre catalogue d'applications (étape 2 ci-dessus). Mettez à jour le paquet de l'application Teams dans le Centre d'administration Teams si un nouveau accesspoint-teams.zip a été publié.
  4. Revisitez la page Terminer la configuration après la mise à niveau — elle accorde de façon idempotente toutes les autorisations Graph introduites depuis votre déploiement initial.
  5. Si vous mettez en miroir l'image du travailleur média dans votre propre registre, importez l'étiquette de la nouvelle version avant ou immédiatement après la mise à niveau — la tâche tire l'étiquette correspondant à apiVersion.

Le mode de mise à niveau reporte les paramètres d'application ajoutés par l'opérateur lors du redéploiement — par exemple Documents__EmailRenderEngine, un License__RealizerApiUrl personnalisé, ou RateLimiting__RequestsPerMinute (le budget de demandes API par utilisateur, 1 200 par minute par défaut). Les paramètres gérés par le modèle sont réaffirmés à leurs valeurs de modèle.

Données d'exemple pour les locataires d'évaluation. Pour les environnements de démonstration et d'évaluation, un composant web distinct, AccessPoint DevTools (accesspoint-devtools.sppkg), peut réinitialiser un locataire et préremplir des données d'exemple adaptées à la juridiction — utilisateurs fictifs, demandes, affectations et documents générés — au moyen d'un bouton Reconstruire la démo en un clic. Il réutilise la connexion API de l'application principale et déclare ses propres autorisations API (à approuver une seule fois sous Centre d'administration SharePoint > Avancé > Accès API). Ne pas utiliser en production : les points de terminaison de réinitialisation destructifs ne s'activent que lorsque le paramètre d'App Service DevTools:Enabled=true est défini — déployez ce paquet uniquement sur des locataires de développement ou de démonstration.

Confidentialité des données de notification Teams (facultatif)

Tous les dossiers de demandes, les RPI du demandeur, les documents et l'historique d'audit ne vivent que dans votre propre locataire. Les notifications respectent cela aussi. AccessPoint achemine chaque notification sur jusqu'à trois canaux, et deux d'entre eux ne quittent jamais votre locataire : le flux intégré à l'application (servi depuis votre propre API) et le courriel/Outlook (envoyé depuis votre propre boîte aux lettres partagée via Mail.Send). Le flux d'activité Teams est le seul canal qui, dans son mode par défaut, envoie par POST une petite charge utile à l'API de la Plateforme Realizer — laquelle n'existe que parce que Microsoft Graph exige qu'une notification d'activité soit envoyée par l'application propriétaire du manifeste Teams. L'éditeur n'en conserve rien et ne consigne que les GUID du destinataire et du locataire, et les mêmes notifications arrivent tout de même par courriel et dans l'application. Deux contrôles resserrent ou suppriment même cela :

Minimiser (une bascule). Dans Paramètres > Configuration > Notifications Teams, activez Minimiser le contenu des notifications Teams (confidentialité). La charge utile relayée remplace alors le titre/l'aperçu de la notification et le nom de l'utilisateur agissant par des valeurs neutres génériques, de sorte qu'aucun nom d'assignation ou de tâche, aucun texte de notification et aucun nom personnel ne quitte le locataire — seuls le type d'activité, le numéro de demande et les identifiants d'enregistrement transitent encore, afin que la notification puisse s'acheminer et créer un lien profond. Le texte intégral demeure visible dans le flux intégré à l'application. Aucune modification du manifeste n'est requise. (En coulisses : le paramètre de locataire Notifications:TeamsMinimalPayload.)

Éliminer (auto-hébergement du relais). Un locataire qui ne doit envoyer aucune donnée de notification à l'éditeur peut faire en sorte que sa propre API appelle Graph directement avec sa propre identité managée, de sorte que rien n'atteigne api.realizer.io :

  1. Accordez TeamsActivity.Send (application) à l'identité managée de l'API et donnez-y le consentement de l'administrateur — Graph ne permet qu'à l'application propriétaire du manifeste Teams d'envoyer des notifications d'activité, de sorte que l'identité expéditrice doit correspondre au webApplicationInfo.id du manifeste.
  2. Pointez le manifeste Teams vers votre propre application. Dans manifest.json, définissez webApplicationInfo.id à l'ID client de votre inscription d'application API / identité managée (en remplaçant l'ID d'application de l'éditeur), en laissant webApplicationInfo.resource comme le domaine du site SharePoint. Téléversez le fichier zip modifié directement dans le Centre d'administration Teams — n'utilisez pas « Synchroniser vers Teams » de SharePoint (cela réécrit webApplicationInfo).
  3. Basculez l'API vers le relais direct — ajoutez le paramètre d'App Service Notifications__TeamsRelayMode=Direct (par défaut/non défini = Publisher) et redémarrez. L'API appelle désormais elle-même sendActivityNotification; l'octroi de l'application d'entreprise de l'éditeur n'est plus nécessaire pour les notifications.
  4. Revalidez — envoyez une notification test (confirmez qu'elle crée un lien profond) et confirmez que l'onglet personnel Teams permet toujours la connexion, puisque vous avez modifié webApplicationInfo.id.

Le relais direct conserve 100 % du contenu des notifications à l'intérieur du locataire, mais implique de maintenir un manifeste Teams personnalisé et de redonner son consentement chaque fois que l'ID d'application change. La plupart des locataires qui n'ont besoin que de supprimer le texte libre et les noms personnels devraient plutôt utiliser la bascule Minimiser — aucune modification du manifeste, et la notification crée toujours un lien profond.

Déploiement multilocataire

Utilisez ce modèle lorsque le backend Azure réside dans un locataire Entra ID différent de votre locataire Microsoft 365 — par exemple une équipe de services partagés desservant plusieurs unités d'affaires, un fournisseur de services gérés (MSP) hébergeant pour des clients, ou des locataires Azure/M365 distincts pour des raisons de gouvernance. Un déploiement unique peut desservir plusieurs locataires M365 : l'API isole les données selon l'ID du locataire présent dans le jeton de chaque utilisateur, avec des filtres de requête de base de données propres à chaque locataire et des chemins de blob préfixés par locataire. Chaque locataire M365 nécessite tout de même sa propre licence, son propre déploiement SPFx et ses propres approbations d'autorisations API, ainsi que ses propres identifiants Graph et sa propre boîte aux lettres de notification.

Inscription d'application Graph. Une identité managée ne fonctionne que dans son locataire d'origine ; créez donc une inscription d'application monolocataire dans le locataire M365 (par exemple, AccessPoint Graph Connector), accordez-lui les mêmes autorisations d'application Graph énumérées à l'étape 1 avec le consentement de l'administrateur, puis créez un secret client et reliez-le à l'App Service via Key Vault :

# In the M365 tenant: create the client secret
$secret = az ad app credential reset --id $appId --display-name "AccessPoint" --years 2 --query password -o tsv

# In the Azure subscription: store the secret and reference it from the App Service
az keyvault secret set --vault-name $vaultName --name "GraphClientSecret" --value $secret

az webapp config appsettings set --resource-group $ResourceGroup --name $appName --settings `
    "Graph__TenantId=$m365TenantId" `
    "Graph__ClientId=$appId" `
    "Graph__ClientSecret=@Microsoft.KeyVault(SecretUri=https://$vaultName.vault.azure.net/secrets/GraphClientSecret)"

az webapp restart --resource-group $ResourceGroup --name $appName

Ne stockez jamais le secret directement dans les paramètres de l'App Service ; l'identité managée de l'App Service a besoin du rôle Key Vault Secrets User sur le coffre. Lorsque les trois paramètres Graph__* sont présents, l'API utilise l'inscription d'application ; lorsqu'ils sont absents, elle se rabat sur l'identité managée pour les déploiements dans le même locataire.

Boîte aux lettres partagée et stratégie d'accès des applications. Créez une boîte aux lettres partagée non licenciée dans le locataire M365 pour les notifications par courriel, et limitez Mail.Send afin que l'application ne puisse envoyer que depuis cette seule boîte aux lettres :

Connect-ExchangeOnline -Organization "contoso.onmicrosoft.com"

New-Mailbox -Name "AccessPoint Notifications" -Alias "accesspoint-noreply" -Shared

New-DistributionGroup -Name "AccessPoint Mail Senders" -Type Security -ManagedBy "admin@contoso.com"
Add-DistributionGroupMember -Identity "AccessPoint Mail Senders" -Member "accesspoint-noreply@contoso.com"

New-ApplicationAccessPolicy -AppId $appId -PolicyScopeGroupId "AccessPoint Mail Senders" `
    -AccessRight RestrictAccess -Description "AccessPoint may send only from the shared mailbox"

# Verify (propagation can take up to 30 minutes)
Test-ApplicationAccessPolicy -AppId $appId -Identity "accesspoint-noreply@contoso.com"   # expect: Granted
Test-ApplicationAccessPolicy -AppId $appId -Identity "someother@contoso.com"             # expect: Denied

Chaque locataire M365 répète ensuite les étapes 2 à 5 (applications, approbations, URL de l'API — la même URL d'API dessert tous les locataires). Les notifications du fil d'activité Teams exigent en outre le consentement de l'administrateur pour l'application d'entreprise Realizer et l'application Teams installée pour les utilisateurs; consultez Configuration initiale pour plus de détails.

Dépannage

Le composant web affiche « Token request previously failed ». Il s'agit d'un échec de jeton mis en cache propre à SharePoint Framework : la première tentative du composant web pour obtenir un jeton d'accès a échoué, et SPFx relance le même message pour le reste de la session du navigateur sans réessayer — il continue donc d'apparaître après la correction de la cause, jusqu'à ce que la session de la page soit entièrement actualisée. Cela se produit presque toujours sur un nouveau locataire dont les demandes d'accès API en attente n'ont pas été approuvées. Correction, dans l'ordre : (1) dans Centre d'administration SharePoint → Avancé → Accès API, approuvez chaque demande en attente du paquet AccessPoint — la plus critique est la portée access_as_user de l'API AccessPoint / Realizer, sans laquelle chaque appel échoue; les portées Graph pour les sélecteurs Ajouter depuis Microsoft 365 peuvent être approuvées en même temps. (2) Si l'approbation réussit mais que les jetons échouent toujours, vérifiez dans Centre d'administration Entra → Applications d'entreprise l'application et toute politique d'accès conditionnel qui la bloquerait, et confirmez qu'un administrateur général ou d'application a effectué l'approbation. (3) Actualisez entièrement le navigateur — fermez l'onglet et rouvrez la page, ou déconnectez-vous puis reconnectez-vous; une navigation légère ne suffit pas. Le même message apparaît lorsque les témoins tiers sont bloqués dans une fenêtre privée, car l'iframe de jeton caché échoue — réessayez dans une fenêtre normale avant un diagnostic plus approfondi.

La bannière « AccessPoint X est disponible (vous êtes sur Y) » persiste après le déploiement de la mise à jour. Avec l'hébergement run-from-package, l'App Service en cours d'exécution garde l'ancien paquet monté jusqu'à ce que le site recycle. Si le recyclage propre au déploiement n'a pas eu lieu, la version précédente continue de servir et la bannière est exacte. Redémarrez l'App Service (portail → App Service → Redémarrer, ou az webapp restart -g <rg> -n app-accesspoint-<tenant>) : la nouvelle version se monte au démarrage, valide sa licence, et la bannière disparaît au chargement de page suivant. Les modèles publiés après la version 2.0.73 réaffirment les paramètres d'application avec un cachet propre à chaque déploiement une fois le paquet mis en scène, ce qui déclenche toujours le recyclage — ce problème ne se produit donc qu'avec un modèle plus ancien.

Le redéploiement du modèle échoue avec RoleAssignmentExists. Azure n'autorise qu'une seule attribution de rôle par principal, rôle et portée. Les octrois propres au modèle portent des noms déterministes et sont idempotents, de sorte que cette erreur signifie que le même octroi a aussi été créé en dehors du modèle — typiquement à la main dans le portail ou avec az role assignment create (par exemple en vous accordant vous-même Storage Blob Data Reader sur le compte de stockage d'évaluation des vulnérabilités pour consulter les résultats des analyses, ce que les modèles actuels accordent automatiquement au déployeur). Supprimez l'attribution créée manuellement, nommée dans l'erreur, puis redéployez; le modèle recrée l'octroi identique sous son nom géré, de sorte qu'aucun accès n'est perdu :

# The error's ID is the assignment name
az role assignment list --all --query "[?name=='<id-from-error>']"
az role assignment delete --ids <full-assignment-resource-id>

Les octrois accordés à d'autres personnes ne sont pas touchés — le modèle ne gère que ses propres principaux (l'identité de l'API, l'identité du serveur SQL et le déployeur).

Retour arrière et exploitation

Les mécanismes Azure standard couvrent le retour arrière : redéployez un paquet API précédent depuis l'historique du Centre de déploiement de l'App Service, restaurez Azure SQL par restauration à un point dans le temps (jusqu'à 35 jours), et retéléversez une version antérieure du .sppkg dans le catalogue d'applications. Les importations de paquets de juridiction sont additives et s'annulent par restauration de la base de données. Pour le guide opérationnel complet — procédures de retour arrière détaillées, surveillance et tâches de maintenance — contactez notre équipe de soutien.