---
title: "Stream l'avatar d'un user depuis S3."
method: GET
path: "/api/v1/auth/users/{user_id}/avatar"
tags: ["Authentification"]
---

# Stream l'avatar d'un user depuis S3.

`GET /api/v1/auth/users/{user_id}/avatar`

## Request

- Base URL: `https://erp.eyeot.fr/api/v1`
- URL: `https://erp.eyeot.fr/api/v1/api/v1/auth/users/{user_id}/avatar`
- Auth: none declared

Stream l'avatar d'un user depuis S3.

    Route AVEC AUTH : nécessite une session valide (cookie refresh ou
    Bearer token). Le viewer doit partager au moins une org avec le user
    cible (RGPD : photo profil = PII visible aux collègues uniquement).

    Hardening 2026-05-01 PM-2 (audit cyber Lot A + Lot E) :
    - Rate-limit 60/min par IP
    - Stream par chunks 64KB
    - Soft auth (cookie refresh OR Bearer)
    - Same-org check strict (ferme #13 audit cyber)
    - 403 uniforme si pas auth/pas autorisé → empêche énumération
      d'users (l'attaquant ne peut distinguer 404 user-pas-trouvé vs
      403 cross-org vs 200 avatar-existant)

## Response `200`

Succès — payload `{data, meta}` (cf. API-GUIDE §3.1)

## Other responses

- `404`: Ressource introuvable (ou cross-tenant — équivalent à hidden).
- `429`: Trop de requêtes. Honorer le header `Retry-After` (secondes).

---

[API](https://skmtc.dev/eyeot/apis/eyeot-erp-api.md) · [All operations](https://skmtc.dev/eyeot/apis/eyeot-erp-api/llms.txt) · [OpenAPI document](https://skmtc.dev/eyeot/apis/eyeot-erp-api/revisions/42ab95222a89?raw)
