# Fournisseur OpenID-Connect

## 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 fournisseur OpenID-Connect (OP). Il répond aux requêtes OpenID-Connect pour délivrer l'identité de l'utilisateur (via un jeton identifiant) et des informations (via le point d'accès "User Info").

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

- Flux de codes d'authorisation, implicites et hybrides
- Publication de métadonnée JSON et JWKS (Discovery)
- paramètres `prompt`, `display`, `ui_locales` et `max_age`
- Définitions réclamées supplémentaires
- Références de classe de contexte d'authentification (ACR)
- Nonce
- Enregistrement dynamique
- Génération de hash de jeton d'accès
- Signature du jeton identifiant (HS256/HS384/HS512/RS256/RS384/RS512)
- Point d'accès UserInfo, en JSON ou JWT
- Requête et URI de requête
- Gestion de session

## Configuration

### Service OpenID-Connect

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

### IssuerDB

Aller dans `Paramètres généraux` > `Modules fournisseurs` » `OpenID-Connect` et configurer :

- Activation : mettre à `Activé`.
- Path : conserver `^/oauth2/` sauf s'il faut un autre chemin (dans ce cas, adapter la configuration Apache)
- Règle d'utilisation : une règle pour autoriser l'usage de ce module, mettre 1 pour toujours l'autoriser.

Par exemple, pour n'autoriser que les utilisateurs authentifiés fortement :

    $authenticationLevel > 2

### Configuration de LL::NG en "Relying Party" (client)

Chaque client (Relying Party) a sa propre forme de configuration. LL::NG publie ses métadonnées OpenID-Connect pour faciliter la configuration du client.

La métadonnée se trouve dans l'URL standard “Well Known” : http://auth.example.com/.well-known/openid-configuration

Un exemple de son contenu :

    {
       "end_session_endpoint" : "http://auth.example.com/oauth2/logout",
       "jwks_uri" : "http://auth.example.com/oauth2/jwks",
       "token_endpoint_auth_methods_supported" : [
          "client_secret_post",
          "client_secret_basic"
       ],
       "token_endpoint" : "http://auth.example.com/oauth2/token",
       "response_types_supported" : [
          "code",
          "id_token",
          "id_token token",
          "code id_token",
          "code token",
          "code id_token token"
       ],
       "userinfo_signing_alg_values_supported" : [
          "none",
          "HS256",
          "HS384",
          "HS512",
          "RS256",
          "RS384",
          "RS512"
       ],
       "id_token_signing_alg_values_supported" : [
          "none",
          "HS256",
          "HS384",
          "HS512",
          "RS256",
          "RS384",
          "RS512"
       ],
       "userinfo_endpoint" : "http://auth.example.com/oauth2/userinfo",
       "request_uri_parameter_supported" : "true",
       "acr_values_supported" : [
          "loa-4",
          "loa-1",
          "loa-3",
          "loa-5",
          "loa-2"
       ],
       "request_parameter_supported" : "true",
       "subject_types_supported" : [
          "public"
       ],
       "issuer" : "http://auth.example.com/",
       "grant_types_supported" : [
          "authorization_code",
          "implicit",
          "hybrid"
       ],
       "authorization_endpoint" : "http://auth.example.com/oauth2/authorize",
       "check_session_iframe" : "http://auth.example.com/oauth2/checksession",
       "scopes_supported" : [
          "openid",
          "profile",
          "email",
          "address",
          "phone"
       ],
       "require_request_uri_registration" : "false",
       "registration_endpoint" : "http://auth.example.com/oauth2/register"
    }

### Configuration du client (Relying Party) dans LL::NG

Aller dans le Manager et choisir `Clients OpenID-Connect`, cliquer ensuite sur `Ajouter un client OpenID`. Donner un nom technique (sans espaces ni caratères speciaux), tel “sample-rp” ;

On peut ensuite accéder à la configuration de ce RP.

#### Attributs exportés

On peut faire correspondre les noms d'attributs de session LL::NG à des "claim" OpenID-Connect.

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:

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

L'attribut spécifique `sub` n'est pas défini ici, mais dans le paramètre d'attribut "User" (voir ci-dessous).

On peut également définir des "claims" supplémentaires et les lier aux attributs (voir ci-dessous). Il faut ensuite définir la correspondance de ces nouveaux attributs, par exemple:

- birthplace ⇒ l
- birthcountry ⇒ co

#### Options

- Authentification:
  - Identifiant : identifiant client de ce RP
  - Mot-de-passe : secret partagé avec ce RP (peut être utilisé pour la signature symétrique)
- Affichage :
  - Affichage : Nom de l'application RP
  - Logo: Logo l'application RP
- Attribut utilisateur : attribut de session à utiliser comme identifiant principal (`sub`)
- Algorithme de signature des jetons d'identité : Choisir entre `none`, `HS256`, `HS384`, `HS512`, `RS256`, `RS384`, `RS512`
- Expiration des jetons d'identité: Délai d'expiration des jetons d'identité
- Expiration des jetons d'accès: Délai d'expiration des jetons d'accès
- Adresses de redirection : liste d'adresses de redirection autorisées pour ce RP, séparées par des espaces
- Bypass consent: Enable if you never want to display the scope sharing consent screen (consent will be accepted by default). Bypassing the consent is not compliant with OpenID Connect standard.

#### Extra claims

Associate attributes to extra claims if the RP request them, for example `birth` ⇒ `birthplace birthcountry`