mirror of
https://github.com/R0m1k3/PleinR.git
synced 2026-10-11 17:27:54 +02:00
Connexion Facebook / LinkedIn en OAuth depuis le backoffice
Les jetons se posaient à la main dans docker-compose. Un écran Backend ›
Réseaux sociaux permet désormais de coller les identifiants de l'application,
cliquer Connecter, choisir la page, et ne plus y revenir.
- Table `social_accounts` : identifiants, jetons et cible par réseau. Tous les
secrets sont chiffrés en AES-256-GCM (`src/lib/crypto.ts`), clé
`SOCIAL_TOKEN_KEY` avec repli sur `AUTH_SECRET`.
- Routes `api/social/[network]/{connect,callback}` : `state` anti-CSRF en cookie
httpOnly, échange du code, récupération des pages administrées. Aucun jeton ne
transite par une URL — les cibles sont relistées côté serveur au moment de la
sélection.
- Facebook : jeton utilisateur longue durée puis jeton de PAGE, qui n'expire
pas. LinkedIn : jeton 60 jours, rafraîchi automatiquement si l'application a
obtenu les jetons de rafraîchissement programmatiques.
- Faute de quoi le backoffice affiche la date d'expiration, un bandeau sur le
tableau de bord à J-7 et un bouton Reconnecter.
- `social.ts` lit les identifiants via `social-accounts.ts` : base d'abord,
variables d'environnement ensuite. Les installations existantes continuent de
fonctionner sans modification.
- Le secret d'application n'est jamais renvoyé au navigateur : champ vide =
valeur conservée.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QXNXRC4j5VLfKvpyyisrnb
This commit is contained in:
19 files changed
+2599
-82
No files matched your search
@@ -52,8 +52,17 @@ site sans traitement supplémentaire.
|
||||
## Réseaux sociaux
|
||||
|
||||
- `src/lib/social.ts` publie une promo sur la page Facebook (Graph API) ou
|
||||
LinkedIn (Posts API). Jetons **uniquement** en variables d'environnement, jamais
|
||||
en base ni dans le backoffice. Réseau non configuré = case masquée.
|
||||
LinkedIn (Posts API). `src/lib/social-accounts.ts` gère la configuration : OAuth,
|
||||
jetons, cibles. Réseau non configuré = case masquée.
|
||||
- Les identifiants et jetons vivent en base (`social_accounts`), **chiffrés** via
|
||||
`src/lib/crypto.ts` (AES-256-GCM, clé `SOCIAL_TOKEN_KEY` ou `AUTH_SECRET`), posés
|
||||
depuis `/backend/reseaux`. Les variables d'environnement restent lues en repli.
|
||||
Aucun secret ne doit jamais repartir vers le navigateur.
|
||||
- `isNetworkConfigured()` / `configuredNetworks()` sont **asynchrones** (accès base).
|
||||
- Routes OAuth : `src/app/api/social/[network]/{connect,callback}`. Le `state`
|
||||
anti-CSRF passe par un cookie httpOnly ; aucun jeton ne transite par une URL.
|
||||
- Facebook : le jeton de page n'expire pas. LinkedIn : 60 jours, rafraîchissement
|
||||
programmatique réservé à certains partenaires, d'où le bandeau de reconnexion.
|
||||
- Les images de promo sont stockées en data-URI : l'upload se fait donc en
|
||||
binaire (multipart pour Facebook, Images API en 3 étapes pour LinkedIn), pas
|
||||
par URL.
|
||||
|
||||
Reference in new issue
Block a user