Flux reseau — Application Pause Café CLS

ApplicationPause Café CLS — Gestionnaire de demandes pauses café
URLhttps://pausecafe.groupcls.com
AuteurChristophe Kersuzan — Digital Manager — DSI CLS
DateAvril 2026
ClassificationInterne
DestinatairesEquipe Securite SI / RSSI

1. Description de l'application

Pause Café CLS est une application web de gestion des demandes de pauses café pour les événements internes CLS. Les collaborateurs créent des demandes, l'équipe accueil les traite, et des notifications email automatiques informent le demandeur de l'avancement.

CaracteristiqueDetail
TypeApplication web statique (HTML/CSS/JS) + API serverless
HebergementAzure Static Web App (free tier) — swa-pausecafe-cls
Runtime APIAzure Functions managed (Node.js 18)
Base de donnéesAzure Cosmos DB (NoSQL, free tier) — base pause-cafe
EmailsMicrosoft Graph API (OAuth2 client_credentials)
AuthentificationAzure AD SSO (provider intégré SWA) + MFA
RégionWest Europe (SWA) / France Central (Cosmos DB)
Resource Grouprg-checklist-salles
Code sourceGitHub privé — glagadec/PauseCafe
CI/CDGitHub Actions — déploiement automatique sur push

Rôles utilisateurs

RôleComptesDroits
Adminckersuzan@, ltallieu@, jpoullaouec@Tout (lecture, création, modification, suppression)
Hôtesseaccueil@groupcls.comModification statut, date/heure/salle, commentaire, suppression
EADMadmin-pause-cafe@groupcls.comModification date/heure/salle, suppression
UtilisateurTout @groupcls.comCréation de demande, consultation de ses propres demandes

Données traitées

DonnéeTypeSensibilité
Nom de l'événementTexte libreFaible
Email du demandeurAdresse email CLSDonnée personnelle (RGPD)
Nom du demandeurIdentité Azure ADDonnée personnelle (RGPD)
DirectionListe ferméeFaible
Salle, formule, participantsDonnées métierFaible
Dates/heuresDate ISOFaible
CommentairesTexte libreFaible
Aucune donnée sensible (RH, médicale, bancaire, classifiée défense) n'est traitée par cette application. Les seules données personnelles sont le nom et l'email du demandeur, issus du token Azure AD.

2. Architecture

graph TB subgraph Users["Utilisateurs CLS"] U["Collaborateur\n(navigateur + MFA)"] end subgraph Azure["Tenant Azure CLS"] subgraph SWA["Azure Static Web App\nswa-pausecafe-cls\nWest Europe"] FE["Frontend\nHTML / CSS / JS\n(statique)"] FN["Azure Functions\n(managed, Node.js 18)\n/api/demandes\n/api/config\n/api/dashboard"] end AAD["Azure AD\nTenant CLS\ncfb22cb5-ed63-...\nSSO + MFA"] COSMOS[("Azure Cosmos DB\ncosmos-checklist-cls\nBase: pause-cafe\nContainers: demandes, config\nFrance Central\nChiffrement AES-256")] end subgraph Microsoft["Services Microsoft"] GRAPH["Microsoft Graph API\nhttps://graph.microsoft.com\nMail.Send\nOAuth2 client_credentials"] LOGIN["login.microsoftonline.com\nAuthentification OpenID Connect"] end U -->|"1. HTTPS 443"| FE FE -->|"2. Redirect"| LOGIN LOGIN -->|"3. Token OIDC"| AAD AAD -->|"4. Cookie session"| FE FE -->|"5. POST/GET/PATCH/DELETE\n/api/demandes"| FN FN -->|"6. Query/Insert/Replace"| COSMOS FN -->|"7. POST /v1.0/users/.../sendMail\n(sur changement statut)"| GRAPH style Azure fill:#eff6ff,stroke:#1e3a5f,stroke-width:2px style SWA fill:#dbeafe,stroke:#3b82f6,stroke-width:1px style Microsoft fill:#f1f5f9,stroke:#94a3b8,stroke-width:1px style Users fill:#fff,stroke:#94a3b8,stroke-width:1px

3. Matrice des flux reseau

3.1 Flux entrants

IDSourceDestinationPortProtoDescriptionAuthLAN CLS
PC-IN-01 Navigateur collaborateur CLS pausecafe.groupcls.com
(Azure SWA — West Europe)
443 HTTPS Accès à l'application (pages HTML, JS, CSS, images) Azure AD SSO + MFA AUCUN
PC-IN-02 Frontend (navigateur) pausecafe.groupcls.com/api/*
(Azure Functions — managed)
443 HTTPS Appels API REST : GET/POST/PATCH/DELETE /api/demandes, GET /api/config, GET /api/dashboard Header x-ms-client-principal
(injecté par Azure, non falsifiable)
AUCUN

3.2 Flux sortants

IDSourceDestinationPortProtoDescriptionAuthLAN CLS
PC-OUT-01 Azure Functions
(graph-mail.js)
login.microsoftonline.com
(Azure AD token endpoint)
443 HTTPS Obtention du token OAuth2 (client_credentials grant)
Tenant : cfb22cb5-ed63-4518-b2ef-aeb539d18da7
Client ID + Client Secret AUCUN
PC-OUT-02 Azure Functions
(graph-mail.js)
graph.microsoft.com
POST /v1.0/users/{userId}/sendMail
443 HTTPS Envoi email notification au demandeur lors d'un changement de statut
From : CLSWorkflow@groupcls.com
To : demandeur@groupcls.com
CC : admin-pause-cafe@groupcls.com
Bearer token OAuth2
(permission Mail.Send)
AUCUN

3.3 Flux intra-Azure (internes au tenant CLS)

IDSourceDestinationDescriptionSécurité
PC-INT-01 Azure SWA Azure AD
(login.microsoftonline.com)
Redirection authentification SSO.
Protocole OpenID Connect. Le navigateur est redirigé vers Azure AD, l'utilisateur s'authentifie avec MFA, puis retour vers la SWA avec un cookie de session.
OAuth2 / OIDC / TLS 1.2+
PC-INT-02 Azure Functions Cosmos DB
cosmos-checklist-cls.documents.azure.com:443
Lecture et écriture des demandes de pauses café.
Container demandes : CRUD des demandes.
Container config : lieux, directions, formules.
Connection string (AccountKey)
TLS 1.2+ obligatoire
Chiffrement au repos AES-256

3.4 Flux vers le réseau LAN CLS

ZERO flux vers/depuis le LAN CLS

L'application Pause Café n'a aucune connexion avec le réseau interne CLS : L'application est 100% hébergée dans Azure. Les utilisateurs y accèdent comme ils accèdent à Office 365 : via leur navigateur, en HTTPS, avec leur compte Microsoft CLS.

4. Détail des flux — Diagrammes de séquence

4.1 Connexion d'un utilisateur

sequenceDiagram participant U as Collaborateur CLS participant DNS as DNS groupcls.com participant SWA as Azure SWA
pausecafe.groupcls.com participant AAD as Azure AD
login.microsoftonline.com U->>DNS: Résolution pausecafe.groupcls.com DNS-->>U: CNAME → azurestaticapps6.trafficmanager.net U->>SWA: GET https://pausecafe.groupcls.com (HTTPS 443) SWA->>SWA: Pas de cookie de session valide SWA-->>U: 302 Redirect → /.auth/login/aad U->>AAD: GET /authorize (OpenID Connect) AAD->>U: Page de login Microsoft U->>AAD: Credentials + MFA AAD->>AAD: Vérification identité + MFA AAD-->>SWA: Authorization code SWA->>AAD: POST /token (code → token) AAD-->>SWA: id_token + access_token SWA->>SWA: Crée cookie session (.auth) SWA-->>U: 302 Redirect → / + Set-Cookie U->>SWA: GET / (avec cookie .auth) SWA-->>U: index.html (page d'accueil)

4.2 Création d'une demande

sequenceDiagram participant U as Collaborateur CLS participant SWA as Azure SWA participant FN as Azure Function
/api/demandes participant DB as Cosmos DB
Container: demandes U->>SWA: POST /api/demandes (JSON + cookie .auth) SWA->>SWA: Valide cookie session SWA->>FN: Forward + injecte header x-ms-client-principal FN->>FN: Décode header → email, rôle FN->>FN: Valide champs requis (événement, lieu, direction, dates, formules, participants) FN->>FN: Vérifie date fin > date début FN->>DB: INSERT document (id=UUID, statut="A traiter") DB-->>FN: 201 Created FN-->>SWA: 201 + document créé SWA-->>U: 201 (toast "Demande enregistrée") Note over U,DB: Aucun flux vers le LAN CLS

4.3 Changement de statut + notification email

sequenceDiagram participant H as Hôtesse (accueil@) participant SWA as Azure SWA participant FN as Azure Function
/api/demandes participant DB as Cosmos DB participant TOK as Azure AD
Token endpoint participant GRAPH as Microsoft Graph API H->>SWA: PATCH /api/demandes (statut="Pause installée") SWA->>FN: Forward + header x-ms-client-principal FN->>FN: Décode header → accueil@ → rôle=hôtesse ✓ FN->>DB: READ document (id, partition=direction) DB-->>FN: Document existant (oldStatut="Préparation en cours") FN->>FN: oldStatut ≠ newStatut → email requis FN->>DB: REPLACE document (statut mis à jour) DB-->>FN: 200 OK rect rgb(240, 253, 244) Note over FN,GRAPH: Envoi email notification FN->>TOK: POST /oauth2/v2.0/token
(client_id + client_secret + scope=Mail.Send) TOK-->>FN: Bearer access_token (caché 55 min) FN->>GRAPH: POST /v1.0/users/{userId}/sendMail
From: CLSWorkflow@groupcls.com
To: demandeur@groupcls.com
CC: admin-pause-cafe@groupcls.com GRAPH-->>FN: 202 Accepted end FN-->>SWA: 200 OK + document mis à jour SWA-->>H: Toast "Demande mise à jour" Note over H,GRAPH: Le demandeur reçoit l'email dans sa boîte

5. Sécurité

MesureImplémentation
Authentification Azure AD SSO (provider intégré SWA). MFA appliquée par la politique Azure AD CLS. Aucune page accessible sans authentification (sauf redirection vers login).
Autorisation Vérification du rôle dans chaque endpoint API via le header x-ms-client-principal. Le header est injecté par le reverse proxy Azure et ne peut pas être falsifié par le client.
POST : tout utilisateur authentifié.
PATCH : admin, hôtesse, eadm uniquement.
DELETE : admin, hôtesse, eadm uniquement.
Chiffrement en transit TLS 1.2+ sur tous les flux (navigateur ↔ SWA, Functions ↔ Cosmos DB, Functions ↔ Graph API). Certificat TLS géré automatiquement par Azure.
Chiffrement au repos Cosmos DB : AES-256 (Microsoft-managed keys). Données au repos chiffrées par défaut.
En-têtes HTTP X-Frame-Options: DENY (anti-clickjacking)
X-Content-Type-Options: nosniff (anti-MIME sniffing)
Configurés dans staticwebapp.config.json.
Secrets Client ID, Client Secret (Graph API), Cosmos DB connection string stockés dans les Application Settings de la SWA (chiffrés au repos). Jamais dans le code source.
Isolation réseau Aucun flux vers le LAN CLS. Cosmos DB accessible uniquement depuis les Azure Functions (même Resource Group). Pas d'endpoint public exposé pour la base de données.
Audit Azure AD sign-in logs (connexions SSO). Azure Monitor (requêtes API). GitHub Actions (historique déploiements). Chaque document Cosmos DB contient updated_by (email de l'utilisateur).
Backup Cosmos DB : backup continu Azure (point-in-time restore, 30 jours). Code source : GitHub (historique complet).

6. Détail OAuth2 — Graph API (envoi email)

L'envoi d'email utilise le flux OAuth2 client_credentials (application-to-application, sans interaction utilisateur).

ParamètreValeur
Token endpointhttps://login.microsoftonline.com/cfb22cb5-ed63-4518-b2ef-aeb539d18da7/oauth2/v2.0/token
Grant typeclient_credentials
Scopehttps://graph.microsoft.com/.default
Client ID00f2bf5a-aabd-455b-a2e2-4621b98f1933 (App Registration CLS)
Permission APIMail.Send (application permission, consent admin)
ExpéditeurCLSWorkflow@groupcls.com (boîte partagée)
DestinataireL'email du demandeur (issu du token Azure AD)
Copie (CC)admin-pause-cafe@groupcls.com
DéclencheurChangement de statut (Réception validée, Préparation en cours, Pause installée)
Cache tokenToken caché en mémoire, renouvelé 5 min avant expiration (durée standard : 1h)

7. Synthèse des endpoints exposés

URLMéthodeAuth requiseRôlesDescription
/api/demandesGETSSOTousListe des demandes (filtres : statut, direction, date, mine)
/api/demandesPOSTSSOTousCréation d'une demande
/api/demandesPATCHSSOAdmin, Hôtesse, EADMModification (statut, date, heure, salle, commentaire)
/api/demandes?id=&direction=DELETESSOAdmin, Hôtesse, EADMSuppression d'une demande
/api/configGETSSOTousDonnées de référence (lieux, directions, formules) + rôle
/api/dashboardGETSSOAdmin, Hôtesse, EADMKPIs et statistiques
/.auth/login/aadGETRedirection vers Azure AD (géré par SWA)
/.auth/meGETCookieIdentité de l'utilisateur connecté (géré par SWA)
Tous les endpoints /api/* rejettent les requêtes sans le header x-ms-client-principal (HTTP 401). Ce header est injecté uniquement par Azure après authentification SSO réussie.

8. Résumé des connexions réseau

graph LR subgraph IN["2 flux entrants"] A["PC-IN-01 : Navigateur → SWA (443/HTTPS)"] B["PC-IN-02 : Navigateur → API Functions (443/HTTPS)"] end subgraph OUT["2 flux sortants"] C["PC-OUT-01 : Functions → Azure AD token (443/HTTPS)"] D["PC-OUT-02 : Functions → Graph API sendMail (443/HTTPS)"] end subgraph INT["2 flux internes Azure"] E["PC-INT-01 : SWA ↔ Azure AD (OIDC)"] F["PC-INT-02 : Functions → Cosmos DB (443/TLS)"] end subgraph LAN["LAN CLS"] G["AUCUN FLUX"] end style IN fill:#dbeafe,stroke:#2563eb style OUT fill:#f0fdf4,stroke:#22c55e style INT fill:#fef3c7,stroke:#f59e0b style LAN fill:#fef2f2,stroke:#ef4444,stroke-width:2px style G fill:#fee2e2,stroke:#ef4444,color:#dc2626
CatégorieNombreProtocolePortsImpact LAN CLS
Flux entrants2HTTPS443 uniquementAUCUN
Flux sortants2HTTPS443 uniquementAUCUN
Flux intra-Azure2HTTPS / TLS443Interne Azure
Total6 fluxHTTPS uniquement443 uniquementZERO flux LAN
CLS — Collecte Localisation Satellites — Flux réseau Pause Café — Document interne — Avril 2026