From b34873f98052ac5fb4bf6731a25730075796d764 Mon Sep 17 00:00:00 2001 From: ertopogo Date: Fri, 13 Mar 2026 00:33:28 +0100 Subject: Initial commit medias platform --- MEDIA_ACCESS_API.md | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 MEDIA_ACCESS_API.md (limited to 'MEDIA_ACCESS_API.md') diff --git a/MEDIA_ACCESS_API.md b/MEDIA_ACCESS_API.md new file mode 100644 index 0000000..ec5598e --- /dev/null +++ b/MEDIA_ACCESS_API.md @@ -0,0 +1,78 @@ +# MEDIA_ACCESS_API + +## Objectif +Definir une couche d'autorisation entre viewer-bff et MinIO afin d'appliquer les ACL Keycloak avant chaque lecture media. + +## Principes de securite +- Deny-by-default. +- Validation JWT obligatoire (issuer, audience, signature, expiration). +- Evaluation des roles cumulables pour obtenir les prefixes MinIO autorises. +- Jamais d'acces public direct au bucket prive. +- Utilisation d'URLs pre-signees courtes (TTL court) pour la lecture. + +## Variables d'environnement minimales +- `OIDC_ISSUER=https://kc.arauco.online/realms/chiruca` +- `OIDC_AUDIENCE=media-access-api` +- `OIDC_JWKS_URL=https://kc.arauco.online/realms/chiruca/protocol/openid-connect/certs` +- `RBAC_ROLE_PREFIX=media_reader:folder:` +- `RBAC_ROLE_ALL=media_reader:all` +- `S3_ENDPOINT=http://minio:9000` +- `S3_BUCKET=medias-private` +- `S3_FORCE_PATH_STYLE=true` +- `PRESIGN_TTL_SECONDS=120` + +## Contrat API propose + +### `GET /health` +- Reponse: `200` si service operationnel. + +### `GET /v1/permissions` +- Auth: `Bearer ` +- Reponse `200`: +```json +{ + "subject": "user-id", + "allowAll": false, + "allowedPrefixes": [ + "photos/equipeA/", + "photos/projetX/" + ] +} +``` + +### `POST /v1/presign` +- Auth: `Bearer ` +- Payload: +```json +{ + "objectKey": "photos/equipeA/2026/03/image-001.jpg" +} +``` +- Reponse `200`: +```json +{ + "url": "https://...signature...", + "expiresIn": 120 +} +``` +- Reponses d'erreur: + - `401`: token invalide/absent. + - `403`: role insuffisant ou `objectKey` hors prefixe autorise. + - `404`: objet introuvable. + +## Algorithme d'autorisation (reference) +1. Extraire les roles client depuis le token (`resource_access.media-access-api.roles`). +2. Si `RBAC_ROLE_ALL` present, autoriser. +3. Sinon, filtrer les roles commencant par `RBAC_ROLE_PREFIX`. +4. Convertir chaque role en prefixe MinIO (ex: `media_reader:folder:photos/equipeA` -> `photos/equipeA/`). +5. Autoriser uniquement si `objectKey` commence par un prefixe calcule. + +## Integration viewer-bff +- Le viewer-bff conserve la navigation et la recherche cote interface web. +- Les originaux proteges sont servis via `media-access-api` (URL pre-signee). +- Le bucket MinIO reste prive (pas de policy publique de lecture). + +## Journalisation et audit +- Logger `subject`, `objectKey`, decision (`allow`/`deny`), raison, `requestId`. +- Ne jamais logger un token complet ni des secrets. +- Exporter des metriques de refus ACL pour detection d'erreurs de mapping. -- cgit v1.2.3