# Comptes et fournisseur d'identité

> Premier admin, invitations, accès perdu, écran Utilisateurs et branchement d'un fournisseur OIDC sur la console.

Guide - Depuis la version 1.0.0 - Flexway v1.7.1 - https://flexway.io/docs/operations-console-accounts/

> Guide d'exploitation : configurer, déployer et observer la passerelle. Ce que fait la fonctionnalité côté produit : [guide produit](https://flexway.io/docs/product-overview/) ; l'appeler : [guide développeur](https://flexway.io/docs/developer-overview/).

La console démarre sans fournisseur d'identité : ses comptes locaux vivent dans un `Secret` d'état qu'elle
écrit elle-même. Un fournisseur OIDC est facultatif et coexiste avec eux.

## Étapes

### Premier démarrage

Tel que les NOTES du chart le disent :

1. Lire le mot de passe généré du premier admin dans le `Secret` d'état, décodé en base64 :

   ```bash
   kubectl get secret <release>-flexway-console-state -o jsonpath='{.data.initial-admin-password}' | base64 -d
   ```

2. Se connecter en `admin`, choisir un mot de passe, enrôler une application TOTP et garder les dix codes
   de secours.
3. Utilisateurs -> Inviter : un lien d'invitation à usage unique (72 h par défaut, 24 h ou 7 jours au
   choix) à transmettre - la console n'envoie pas de courriel.

### Retrouver l'accès

1. Accès perdu :

   ```bash
   kubectl exec deploy/<release>-flexway-console -- flexway-console users reset admin
   ```

   (`sts/` au lieu de `deploy/` sans backend).
2. Un compte verrouillé : `... users unlock <login>`.

### Brancher un fournisseur d'identité

Entra ID, Okta, Google, Auth0, Keycloak, Authentik...

1. Déclarer le client OIDC dans les valeurs de la console :

   ```yaml title="values.yaml"
   oidc:
     issuer: https://login.example.com/realms/staff
     clientId: flexway-console
     redirectUrl: https://console.example.com/auth/callback
     displayName: Keycloak               # le bouton « Se connecter avec Keycloak »
     accountUrl: https://login.example.com/realms/staff/account   # facultatif : lien de Mon compte
     rolesClaim: realm_access.roles      # où lire le rôle
     tenantFrom: claim                   # ou role : flexway-viewer:acme donne le tenant acme -
                                         # des rôles que l'utilisateur ne peut pas créer lui-même
     tenantClaim: tenant                 # où lire le tenant d'un lecteur
   existingSecret: console-secrets       # clé client-secret, montée en fichier
   auth:
     local:
       mode: breakglass                  # accounts (défaut), breakglass (admins locaux, 1 h) ou off
   ```

2. Mettre le secret du client dans le `Secret` nommé par `existingSecret` (clé `client-secret`).
3. Déployer, puis se connecter par le bouton du fournisseur.

### Gérer les comptes

Ce que l'écran Utilisateurs permet, et ce qu'il garde :

| Besoin | Où | Ce qui se passe |
| --- | --- | --- |
| Un lien plus court ou plus long | Inviter, ou « Réinitialiser le mot de passe » sur un compte | 24 h, 72 h (défaut) ou 7 jours ; usage unique, affiché une fois, remplacé par toute réinitialisation |
| Exiger le second facteur d'un lecteur | Panneau du compte -> « Exiger le second facteur » | Ses sessions sans second facteur se ferment, il enrôle une application à sa prochaine connexion |
| Changer de téléphone | Mon compte -> « Changer d'application » | Mot de passe **et** code de l'application actuelle (ou un code de secours) ; l'ancienne vaut jusqu'à la confirmation, qui remet dix codes neufs et ferme les autres sessions |
| Une connexion inconnue | Mon compte -> « Fermer toutes les autres sessions » | Toutes les autres sessions se ferment en moins de 5 s ; la courante continue |
| Un compte verrouillé | Panneau du compte -> « Déverrouiller maintenant » | **Tous** les verrous du compte se lèvent : chaque adresse, le délai progressif, le second facteur |
| Une identité du fournisseur à retirer de la liste | Panneau de l'identité -> « Oublier » | Elle revient à sa prochaine connexion ; ses droits restent ceux de son jeton. Retirer l'accès se fait chez le fournisseur |

## Vérifier

- Un compte du fournisseur sans rôle reconnu n'a aucun accès et voit les rôles que portait son jeton.
- Un lecteur connecté ne lit que son tenant ; en nommer un autre donne un refus explicite.
- L'écran Utilisateurs montre les identités OIDC vues à côté des comptes locaux, en lecture seule.

## À savoir

> [!CAUTION]
> Qui peut `exec` dans le pod de la console en est administrateur : réserver
> `pods/exec` sur ce `Deployment` à ses exploitants (chaque action de la commande est auditée). Ne pas
> exposer la console publiquement. Derrière une ingress, déclarer son réseau dans `trustedProxies` :
> chaque client est alors compté sous sa propre adresse - cinq échecs verrouillent l'adresse de
> l'attaquant, jamais celle du propriétaire, qui attend au plus une minute.

**Ce que la console garde** - une vue bornée de l'activité des comptes (500 évènements, 64 Kio,
90 jours : réseau masqué /24 ou /48, famille du navigateur, jamais une adresse ni le `User-Agent`)
et les identités OIDC vues (empreinte de l'émetteur et du sujet, jamais le sujet ; identifiant de
connexion et nom ; oubliées 90 jours après la dernière connexion), dans des clés à part du `Secret`
d'état, lues par les seuls admins. Le journal de la console reste la piste d'audit complète. La
jauge `flexway_console_store_bytes{key}` montre le poids de chaque clé : leur somme reste sous
900 Kio, l'activité puis le registre cèdent avant un compte. Langue et thème restent dans le
navigateur.

*Comptes locaux et fournisseur facultatif depuis `1.0.0` ; Utilisateurs et Mon compte refondus, activité des
comptes et identités OIDC vues en `1.2.0`.*
