feat(auth): authentification par proxy (oauth2-proxy, Authelia…)

Derrière un proxy d'authentification, FanKarr demandait une seconde
connexion. Avec PROXY_AUTH_HEADER, la session est ouverte à partir du nom
d'utilisateur transmis par le proxy.

- server/lib/proxy-auth.ts : lecture de l'en-tête, uniquement pour les
  connexions venant de PROXY_AUTH_TRUSTED_PROXIES (adresse du socket, pas
  X-Forwarded-For) ; fonction désactivée si cette liste est vide
- compte rapproché par nom (sans casse) ; création d'un compte utilisateur
  sans mot de passe avec PROXY_AUTH_AUTO_CREATE ; premier compte toujours
  créé par l'assistant
- server/auth.ts : middleware proxyAuth avant les routes, qui ouvre ou
  remplace la session ; /api/auth/status expose proxyAuth et logoutUrl
- déconnexion : redirection vers PROXY_AUTH_LOGOUT_URL si défini
- profil et gestion des utilisateurs : libellés pour les comptes sans mot
  de passe qui ne viennent pas de Jellyfin
- tests vitest du module ; fichiers de test exclus de la compilation serveur

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
zacharyandClaude Opus 5.5 committed 2026-10-03 22:01:57 +02:00
1 parent 804436ff70
commit e13d43d186
13 files changed
+349 -18

No files matched your search

+47
View File
@@ -199,6 +199,10 @@ FanKarr est alors accessible sur `http://localhost:9898`. La configuration, les
| `AUTH_TOKEN_EXPIRY` | `30d` | Durée de validité de la session (ex. `7d`, `1y` ; `never` ou `0` : pas d'expiration) |
| `GITHUB_BASE` | dépôt scraper | Adresse de base des données du scraper, si vous hébergez votre propre copie |
| `BASE_URL` | non défini | Sous-dossier derrière un reverse proxy (ex. `/fankarr`) |
| `PROXY_AUTH_HEADER` | non défini | En-tête contenant le nom d'utilisateur authentifié par le proxy (ex. `Remote-User`) |
| `PROXY_AUTH_TRUSTED_PROXIES` | non défini | Adresses autorisées à envoyer cet en-tête (IP ou plages IPv4 CIDR, séparées par des virgules) |
| `PROXY_AUTH_AUTO_CREATE` | `false` | Crée un compte utilisateur à la première connexion d'un nom inconnu |
| `PROXY_AUTH_LOGOUT_URL` | non défini | Page de déconnexion du proxy, ouverte par « Se déconnecter » (ex. `/oauth2/sign_out`) |
Par défaut, `GITHUB_BASE` vaut `https://raw.githubusercontent.com/masutayunikon/fankarr-scraper/main`.
@@ -233,6 +237,49 @@ Laissez `BASE_URL` vide pour un sous-domaine dédié (`https://fankarr.exemple.t
---
### Authentification par proxy (oauth2-proxy, Authelia…)
Si un proxy d'authentification (oauth2-proxy devant Keycloak, Authelia,
Authentik…) contrôle déjà l'accès à FanKarr, FanKarr peut ouvrir la session
directement à partir du nom d'utilisateur qu'il transmet, sans second écran de
connexion :
```yaml
environment:
- PROXY_AUTH_HEADER=X-Forwarded-Preferred-Username # en-tête posé par le proxy
- PROXY_AUTH_TRUSTED_PROXIES=172.18.0.0/16 # adresse(s) du reverse proxy
- PROXY_AUTH_LOGOUT_URL=/oauth2/sign_out # facultatif
# - PROXY_AUTH_AUTO_CREATE=true # facultatif
```
- Le nom transmis est rapproché d'un compte FanKarr existant, sans tenir compte
de la casse. Un nom inconnu est refusé (avertissement dans les journaux), sauf
avec `PROXY_AUTH_AUTO_CREATE=true` : un compte **utilisateur** sans mot de
passe est alors créé. Les rôles se gèrent dans Paramètres › Utilisateurs.
- L'en-tête n'est lu que pour les connexions venant de
`PROXY_AUTH_TRUSTED_PROXIES` : sans cette variable, la fonction reste
désactivée. Ne publiez pas le port de FanKarr au-delà du proxy et des
applications qui utilisent l'API.
- Le premier compte administrateur se crée toujours avec l'assistant.
- La connexion par mot de passe et par Jellyfin reste possible, ainsi que les
jetons d'API.
Exemple avec NPMplus et oauth2-proxy : choisissez `oauth2proxy` dans
« Auth Request » de la location FanKarr. L'en-tête `X-User` que NPMplus
transmet contient l'identifiant interne de l'utilisateur (`sub`, un UUID avec
Keycloak) et non son nom de connexion. Transmettez plutôt ce dernier en ajoutant
dans la configuration avancée de la location :
```nginx
auth_request_set $preferred_username $upstream_http_x_auth_request_preferred_username;
proxy_set_header X-Forwarded-Preferred-Username $preferred_username;
```
puis `PROXY_AUTH_HEADER=X-Forwarded-Preferred-Username`. oauth2-proxy doit
tourner avec `--set-xauthrequest`.
---
### Premier lancement
1. Ouvrez `http://localhost:9898` (ou l'adresse de votre serveur).