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.
| Caracteristique | Detail |
|---|---|
| Type | Application web statique (HTML/CSS/JS) + API serverless |
| Hebergement | Azure Static Web App (free tier) — swa-pausecafe-cls |
| Runtime API | Azure Functions managed (Node.js 18) |
| Base de données | Azure Cosmos DB (NoSQL, free tier) — base pause-cafe |
| Emails | Microsoft Graph API (OAuth2 client_credentials) |
| Authentification | Azure AD SSO (provider intégré SWA) + MFA |
| Région | West Europe (SWA) / France Central (Cosmos DB) |
| Resource Group | rg-checklist-salles |
| Code source | GitHub privé — glagadec/PauseCafe |
| CI/CD | GitHub Actions — déploiement automatique sur push |
| Rôle | Comptes | Droits |
|---|---|---|
| Admin | ckersuzan@, ltallieu@, jpoullaouec@ | Tout (lecture, création, modification, suppression) |
| Hôtesse | accueil@groupcls.com | Modification statut, date/heure/salle, commentaire, suppression |
| EADM | admin-pause-cafe@groupcls.com | Modification date/heure/salle, suppression |
| Utilisateur | Tout @groupcls.com | Création de demande, consultation de ses propres demandes |
| Donnée | Type | Sensibilité |
|---|---|---|
| Nom de l'événement | Texte libre | Faible |
| Email du demandeur | Adresse email CLS | Donnée personnelle (RGPD) |
| Nom du demandeur | Identité Azure AD | Donnée personnelle (RGPD) |
| Direction | Liste fermée | Faible |
| Salle, formule, participants | Données métier | Faible |
| Dates/heures | Date ISO | Faible |
| Commentaires | Texte libre | Faible |
| ID | Source | Destination | Port | Proto | Description | Auth | LAN 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 |
| ID | Source | Destination | Port | Proto | Description | Auth | LAN 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 |
| ID | Source | Destination | Description | Sé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 |
| Mesure | Implé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). |
L'envoi d'email utilise le flux OAuth2 client_credentials (application-to-application, sans interaction utilisateur).
| Paramètre | Valeur |
|---|---|
| Token endpoint | https://login.microsoftonline.com/cfb22cb5-ed63-4518-b2ef-aeb539d18da7/oauth2/v2.0/token |
| Grant type | client_credentials |
| Scope | https://graph.microsoft.com/.default |
| Client ID | 00f2bf5a-aabd-455b-a2e2-4621b98f1933 (App Registration CLS) |
| Permission API | Mail.Send (application permission, consent admin) |
| Expéditeur | CLSWorkflow@groupcls.com (boîte partagée) |
| Destinataire | L'email du demandeur (issu du token Azure AD) |
| Copie (CC) | admin-pause-cafe@groupcls.com |
| Déclencheur | Changement de statut (Réception validée, Préparation en cours, Pause installée) |
| Cache token | Token caché en mémoire, renouvelé 5 min avant expiration (durée standard : 1h) |
| URL | Méthode | Auth requise | Rôles | Description |
|---|---|---|---|---|
/api/demandes | GET | SSO | Tous | Liste des demandes (filtres : statut, direction, date, mine) |
/api/demandes | POST | SSO | Tous | Création d'une demande |
/api/demandes | PATCH | SSO | Admin, Hôtesse, EADM | Modification (statut, date, heure, salle, commentaire) |
/api/demandes?id=&direction= | DELETE | SSO | Admin, Hôtesse, EADM | Suppression d'une demande |
/api/config | GET | SSO | Tous | Données de référence (lieux, directions, formules) + rôle |
/api/dashboard | GET | SSO | Admin, Hôtesse, EADM | KPIs et statistiques |
/.auth/login/aad | GET | — | — | Redirection vers Azure AD (géré par SWA) |
/.auth/me | GET | Cookie | — | Identité de l'utilisateur connecté (géré par SWA) |
/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.
| Catégorie | Nombre | Protocole | Ports | Impact LAN CLS |
|---|---|---|---|---|
| Flux entrants | 2 | HTTPS | 443 uniquement | AUCUN |
| Flux sortants | 2 | HTTPS | 443 uniquement | AUCUN |
| Flux intra-Azure | 2 | HTTPS / TLS | 443 | Interne Azure |
| Total | 6 flux | HTTPS uniquement | 443 uniquement | ZERO flux LAN |