# OpenID Connect

Authentification | Utilisateurs | Mot-de-passe
--- | --- | ---
✔ | ✔ |

## Présentation

OpenID Connect est un protocole basé sur les piles REST, OAuth 2.0 et JOSE. Il est décrit ici : http://openid.net/connect/.

LL::NG peut agir comme un client OpenID-Connect (« Relying Party » RP), ce qui permet de fédérer <a1>LL::NG</a1> avec : L'identité utilisateur sera récupérée via in jeton d'identification, et les attributs utilisateurs via le point d'accès UserInfo.

Comme RP, LL::NG supporte de nombreuses fonctionnalités OpenID-Connect :

- Débit de code d'autorisation
- Téléchargement automatique de JWKS
- Vérification de signature JWT
- Vérification de hashage des jetons d'accès
- Validation de jeton d'identité
- Récupérer UserInfo au format JSON ou JWT
- Déconnexion via point d'accès EndSession

On peut utiliser ce module d'authentification pour lier un serveur LL::NG à n'importe quel fournisseur OpenID-Connect. Quelques exemples, avec leur documentation :

Google | France Connect
--- | ---

## Configuration

### Service OpenID-Connect

Voir le chapître de configuration du service OpenID-Connect.

### Authentification et base d'utilisateurs

Dans `Paramètres généraux` > `Modules d'authentification`, choisir :

- Module d'authentication : OpenID-Connect
- Module utilisateurs : OpenID-Connect

Comme les mots-de-passe ne sernt pas gérés par LL::NG, il est possile de désactiver le module mots-de-passe du menu.

Ensuite dans `Paramètres généraux` > `Paramètres d'authentification` > `Paramètres OpenID-Connect` , on peut indiquer :

- Niveau d'authentification : niveau d'authentification associé à ce module
- Paramètres GET de rappel : nom du paramètre GET utilisé pour intercepter le rappel (défaut: openidconnectcallback)
- State session timeout: duration of a state session (used to keep state information between authentication request and authentication response) in seconds (default: 600)

### Enregistrer LL::NG dans un fournisseur d'identité OpenID-Connect

Pour enregistrer LL::NG, il faut renseigner quelques informations telles le nom d'application ou le logo. Une des informations exigées est l'URL de redirection (une ou plusieurs).

Pour connaître cette information, prendre simplement l'URL et le paramètre GET de rappel, par exemple :

- http://auth.example.com/?openidcallback=1
- http://auth.example.com/index.pl?openidcallback=1
- http://auth.example.com/?lmAuth=oidc&openidcallback=1

Si le backend choix est utilisé, il faut ajouter le paramètre choix dans l'URL de redirection

Après enregistrement, l'OP doit donner un identifiant et un secret clients, qui seront utilisé pour configurer l'OP dans LL::NG.

### Déclarer le fournisseur OpenID Connect dans LL::NG

Dans le manager, choisir `Fournisseurs OpenID-Connect` et cliquer sur `Ajouter un fournisseur OpenID-Connect`. Donner un nom technique (sans espaces ni caratères speciaux), tel “sample-op” ;

On peut ensuite accéder à la configuration de cet OP.

#### Métadonnée

L'OP peut publier sa métadonnée dans un fichier JSON (voir par exemple la métadonnée Google). Copier le contenu de ce fichie dans l'emplacement dédié.

À défaut de métadonnée, il faut les écrire. Les champs obligatoires sont :

- issuer
- authorization_endpoint
- token_endpoint
- userinfo_endpoint

On peut aussi définir :

- jwks_uri
- endsession_endpoint

Modèle exemple :

    {
      "issuer": "https://auth.example.com/",
      "authorization_endpoint": "https://auth.example.com/oauth2/authorize",
      "token_endpoint": "https://auth.example.com/oauth2/token",
      "userinfo_endpoint": "https://auth.example.com/oauth2/userinfo",
      "end_session_endpoint":"https://auth.example.com/oauth2/logout"
    }

#### Donnée JWKS

JWKS est un fichier JSON contenant des clefs publiques. LL::NG peut les récupérer autoatiquement si jwks_uri est défini dans la métadonnée. Sinon copier le contenu du fichier JSON dans l'emplacement dédié.

Si le fournisseur OpenID-Connect n'utilise qu'une clef symétrique de chiffrement, la donnée JWKS n'est pas nécessaire.

#### Attributs exportés

Définir ici la correspondance entre le contenu de la sessions LL::NG et les champs fournis dans la réponse UserInfo. Les champs sont définis dans le standard OpenID-Connect, et dépendent de la portée requise par LL::NG (voir les options dans le prochain chapitre).

Nom affiché | Type | Exemple de correspondance d'attributs LDAP
--- | --- | ---
sub | chaîne | uid
nom | chaîne | cn
given_name | chaîne | givenName
family_name | chaîne | sn
middle_name | chaîne |
nickname | chaîne |
preferred_username | chaîne | displayName
profile | chaîne | labeledURI
picture | chaîne |
website | chaîne |
email | chaîne | mail
email_verified | boolean |
gender | chaîne |
birthdate | chaîne |
zoneinfo | chaîne |
locale | chaîne | preferredLanguage
phone_number | chaîne | telephoneNumber
phone_number_verified | boolean |
updated_at | chaîne |
formatted | chaîne | registeredAddress
street_address | chaîne | street
locality | chaîne | l
region | chaîne | st
postal_code | chaîne | postalCode
country | chaîne | co

Ainsi on peut définir par exemple:

- cn ⇒ name
- sn ⇒ family_name
- mail ⇒ email
- uid ⇒ sub

#### Options

- Configuration :
  - Configuration endpoint: URL de point d'accès de configuration de l'OP
  - Durée de vie de la donnée JWKS : au delà de ce délai, LL::NG effectuera une requête pour rafraîchir la donnée JWKS. Mettre à 0 pour désactiver.
  - Identifiant client : identifiant client donné par l'OP
  - Secret client : secret client donné par l'OP
  - Store ID token: Allows one to store the ID token (JWT) inside user session. Don't enable it unless you need to replay this token on an application, or if you need the id_token_hint parameter when using logout.
- Protocole :
  - Portée : valeur du paramètre de portée (exemple : profil openid). La portée `openid` est exigée.
  - Affichage : valeur du paramètre d'affichage (exemple : page)
  - Prompt : valeur du paramètre prompt (exemple : consent)
  - Âge max : valeur du paramètre max_age (exemple : 3600)
  - UI locales : valeur du paramètre ui_locales (exemple : en-GB en fr-FR fr)
  - Valeurs ACR : valeur des paramètres acr_values (exemple : loa-1)
  - Méthode d'authentification du point d'accès du jeton : choisir entre `client_secret_post` et `client_secret_basic`
  - Vérifier la signature JWT : mettre à 0 pour désactiver la signature JWT
  - Durée de vie max des jetons : si défini, LL::NG examinera la date du jeton d'identification et refusera les jetons trop anciens
  - Utiliser Nonce : si activé, un nonce sera envoyé, et vérifié depuis le jeton d'identité
- Affichage :
  - Nom affiché : nom de l'application
  - Logo : logo de l'application