lemonldap-ng/po-doc/fr/pages/documentation/current/authopenidconnect.html
Xavier Guimard 2df81aaa1d Update doc
2017-03-30 05:08:56 +00:00

436 lines
21 KiB
HTML

<!DOCTYPE html>
<html lang="fr" dir="ltr">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="utf-8" />
<title>documentation:2.0:authopenidconnect</title><!-- //if:usedebianlibs
<link rel="stylesheet" type="text/css" href="/javascript/bootstrap/css/bootstrap.min.css" />
//elsif:useexternallibs
<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"></script>
//elsif:cssminified
<link rel="stylesheet" type="text/css" href="/static/bwr/bootstrap/dist/css/bootstrap.min.css" />
//else --><!-- //endif -->
<meta name="generator" content="DokuWiki"/>
<meta name="robots" content="index,follow"/>
<meta name="keywords" content="documentation,2.0,authopenidconnect"/>
<link rel="search" type="application/opensearchdescription+xml" href="lib/exe/opensearch.html" title="LemonLDAP::NG"/>
<link rel="start" href="authopenidconnect.html"/>
<link rel="contents" href="authopenidconnect.html" title="Sitemap"/>
<link rel="stylesheet" type="text/css" href="lib/exe/css.php.t.bootstrap3.css"/>
<link rel="stylesheet" type="text/css" href="/static/bwr/bootstrap/dist/css/bootstrap.css" />
<script type="text/javascript">/*<![CDATA[*/var NS='documentation:2.0';var JSINFO = {"id":"documentation:2.0:authopenidconnect","namespace":"documentation:2.0"};
/*!]]>*/</script>
<script type="text/javascript" charset="utf-8" src="lib/exe/js.php.t.bootstrap3.js"></script><!-- //if:usedebianlibs
<script type="text/javascript" src="/javascript/jquery/jquery.min.js"></script>
//elsif:useexternallibs
<script type="text/javascript" src="http://code.jquery.com/jquery-2.2.0.min.js"></script>
//elsif:jsminified
<script type="text/javascript" src="/static/bwr/jquery/dist/jquery.min.js"></script>
//else -->
<script type="text/javascript" src="/static/bwr/jquery/dist/jquery.js"></script><!-- //endif --><!-- //if:usedebianlibs
<script type="text/javascript" src="/javascript/jquery-ui/jquery-ui.min.js"></script>
//elsif:useexternallibs
<script type="text/javascript" src="http://code.jquery.com/ui/1.10.4/jquery-ui.min.js"></script>
//elsif:jsminified
<script type="text/javascript" src="/lib/scripts/jquery-ui.min.js"></script>
//else -->
<script type="text/javascript" src="/lib/scripts/jquery-ui.js"></script><!-- //endif -->
</head>
<body>
<div class="dokuwiki export container"><!-- TOC START -->
<div id="dw__toc">
<h3 class="toggle">Table of Contents</h3>
<div>
<ul class="toc">
<li class="level1"><div class="li"><a href="#presentation">Présentation</a></div></li>
<li class="level1"><div class="li"><a href="#configuration">Configuration</a></div>
<ul class="toc">
<li class="level2"><div class="li"><a href="#openid_connect_service">Service OpenID-Connect</a></div></li>
<li class="level2"><div class="li"><a href="#authentication_and_userdb">Authentification et base d'utilisateurs</a></div></li>
<li class="level2"><div class="li"><a href="#register_llng_to_an_openid_connect_provider">Enregistrer LL::NG dans un fournisseur d'identité OpenID-Connect</a></div></li>
<li class="level2"><div class="li"><a href="#declare_the_openid_connect_provider_in_llng">Déclarer le fournisseur OpenID Connect dans LL::NG</a></div>
<ul class="toc">
<li class="level3"><div class="li"><a href="#metadata">Métadonnée</a></div></li>
<li class="level3"><div class="li"><a href="#jwks_data">Donnée JWKS</a></div></li>
<li class="level3"><div class="li"><a href="#exported_attributes">Attributs exportés</a></div></li>
<li class="level3"><div class="li"><a href="#options">Options</a></div></li>
</ul></li>
</ul></li>
</ul>
</div>
</div><!-- TOC END -->
<h1 class="sectionedit1" id="openid_connect">OpenID Connect</h1>
<div class="level1">
<div class="table sectionedit2"><table class="inline table table-bordered table-striped">
<thead>
<tr class="row0 roweven">
<th class="col0 centeralign"> Authentification </th><th class="col1 centeralign"> Utilisateurs </th><th class="col2 centeralign"> Mot-de-passe </th>
</tr>
</thead>
<tr class="row1 rowodd">
<td class="col0 centeralign"></td><td class="col1 centeralign"></td><td class="col2"> </td>
</tr>
</table></div><!-- EDIT2 TABLE [31-94] -->
</div><!-- EDIT1 SECTION "OpenID Connect" [1-95] -->
<h2 class="sectionedit3" id="presentation">Présentation</h2>
<div class="level2">
<div class="noteclassic">OpenID Connect est un protocole basé sur les piles REST, OAuth 2.0 et JOSE. Il est décrit ici : <a href="http://openid.net/connect/" class="urlextern" title="http://openid.net/connect/" rel="nofollow">http://openid.net/connect/</a>.
</div>
<p>
<abbr title="LemonLDAP::NG">LL::NG</abbr> peut agir comme un client OpenID-Connect (« Relying Party » RP), ce qui permet de fédérer &lt;a1&gt;LL::NG&lt;/a1&gt; 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.
</p>
<p>
Comme RP, <abbr title="LemonLDAP::NG">LL::NG</abbr> supporte de nombreuses fonctionnalités OpenID-Connect :
</p>
<ul>
<li class="level1"><div class="li"> Débit de code d'autorisation</div>
</li>
<li class="level1"><div class="li"> Téléchargement automatique de JWKS</div>
</li>
<li class="level1"><div class="li"> Vérification de signature JWT</div>
</li>
<li class="level1"><div class="li"> Vérification de hashage des jetons d'accès</div>
</li>
<li class="level1"><div class="li"> Validation de jeton d'identité</div>
</li>
<li class="level1"><div class="li"> Récupérer UserInfo au format JSON ou JWT</div>
</li>
<li class="level1"><div class="li"> Déconnexion via point d'accès EndSession</div>
</li>
</ul>
<p>
On peut utiliser ce module d'authentification pour lier un serveur <abbr title="LemonLDAP::NG">LL::NG</abbr> à n'importe quel fournisseur OpenID-Connect. Quelques exemples, avec leur documentation :
</p>
<div class="table sectionedit4"><table class="inline table table-bordered table-striped">
<thead>
<tr class="row0 roweven">
<th class="col0 centeralign"> Google </th><th class="col1 centeralign"> France Connect </th>
</tr>
</thead>
<tr class="row1 rowodd">
<td class="col0 centeralign"> <a href="authopenidconnect_google.html" class="media" title="documentation:2.0:authopenidconnect_google"><img src="icons/kmultiple.png" class="mediacenter" alt="" /></a> </td><td class="col1 centeralign"> <a href="authopenidconnect_franceconnect.html" class="media" title="documentation:2.0:authopenidconnect_franceconnect"><img src="icons/kmultiple.png" class="mediacenter" alt="" /></a> </td>
</tr>
</table></div><!-- EDIT4 TABLE [905-1106] -->
<div class="noteimportant">OpenID-Connect specification isn't finished for logout propagation. So logout initiated by relaying-party will be forward to OpenID-Connect provider but logout initiated by the provider (or another RP) will not be propagated. LLNG will implement this when <abbr title="spécification">spec</abbr> will be published.
</div>
</div><!-- EDIT3 SECTION "Presentation" [96-1410] -->
<h2 class="sectionedit5" id="configuration">Configuration</h2>
<div class="level2">
</div><!-- EDIT5 SECTION "Configuration" [1411-1437] -->
<h3 class="sectionedit6" id="openid_connect_service">Service OpenID-Connect</h3>
<div class="level3">
<p>
Voir le chapître de configuration du <a href="openidconnectservice.html" class="wikilink1" title="documentation:2.0:openidconnectservice">service OpenID-Connect</a>.
</p>
</div><!-- EDIT6 SECTION "OpenID Connect Service" [1438-1546] -->
<h3 class="sectionedit7" id="authentication_and_userdb">Authentification et base d'utilisateurs</h3>
<div class="level3">
<p>
Dans <code>Paramètres généraux</code> &gt; <code>Modules d'authentification</code>, choisir :
</p>
<ul>
<li class="level1"><div class="li"> <strong>Module d'authentication</strong> : OpenID-Connect</div>
</li>
<li class="level1"><div class="li"> <strong>Module utilisateurs</strong> : OpenID-Connect</div>
</li>
</ul>
<div class="notetip">Comme les mots-de-passe ne sernt pas gérés par <abbr title="LemonLDAP::NG">LL::NG</abbr>, il est possile de désactiver le <a href="portalmenu.html#menu_modules" class="wikilink1" title="documentation:2.0:portalmenu">module mots-de-passe du menu</a>.
</div>
<p>
Ensuite dans <code>Paramètres généraux</code> &gt; <code>Paramètres d'authentification</code> &gt; <code>Paramètres OpenID-Connect </code>, on peut indiquer :
</p>
<ul>
<li class="level1"><div class="li"> <strong>Niveau d'authentification</strong> : niveau d'authentification associé à ce module</div>
</li>
<li class="level1"><div class="li"> <strong>Paramètres GET de rappel</strong> : nom du paramètre GET utilisé pour intercepter le rappel (défaut: openidconnectcallback)</div>
</li>
<li class="level1"><div class="li"> <strong>State session timeout</strong>: duration of a state session (used to keep state information between authentication request and authentication response) in seconds (default: 600)</div>
</li>
</ul>
</div><!-- EDIT7 SECTION "Authentication and UserDB" [1547-2338] -->
<h3 class="sectionedit8" id="register_llng_to_an_openid_connect_provider">Enregistrer LL::NG dans un fournisseur d'identité OpenID-Connect</h3>
<div class="level3">
<p>
Pour enregistrer <abbr title="LemonLDAP::NG">LL::NG</abbr>, il faut renseigner quelques informations telles le nom d'application ou le logo. Une des informations exigées est l'<abbr title="Uniform Resource Locator">URL</abbr> de redirection (une ou plusieurs).
</p>
<p>
Pour connaître cette information, prendre simplement l'<abbr title="Uniform Resource Locator">URL</abbr> et le paramètre GET de rappel, par exemple :
</p>
<ul>
<li class="level1"><div class="li"> <a href="http://auth.example.com/?openidcallback=1" class="urlextern" title="http://auth.example.com/?openidcallback=1" rel="nofollow">http://auth.example.com/?openidcallback=1</a></div>
</li>
<li class="level1"><div class="li"> <a href="http://auth.example.com/index.pl?openidcallback=1" class="urlextern" title="http://auth.example.com/index.pl?openidcallback=1" rel="nofollow">http://auth.example.com/index.pl?openidcallback=1</a></div>
</li>
<li class="level1"><div class="li"> <a href="http://auth.example.com/?lmAuth=oidc&amp;openidcallback=1" class="urlextern" title="http://auth.example.com/?lmAuth=oidc&amp;openidcallback=1" rel="nofollow">http://auth.example.com/?lmAuth=oidc&amp;openidcallback=1</a></div>
</li>
</ul>
<div class="noteimportant">Si le <a href="authchoice.html" class="wikilink1" title="documentation:2.0:authchoice">backend choix</a> est utilisé, il faut ajouter le paramètre choix dans l'<abbr title="Uniform Resource Locator">URL</abbr> de redirection
</div>
<p>
Après enregistrement, l'OP doit donner un identifiant et un secret clients, qui seront utilisé pour configurer l'OP dans <abbr title="LemonLDAP::NG">LL::NG</abbr>.
</p>
</div><!-- EDIT8 SECTION "Register LL::NG to an OpenID Connect Provider" [2339-3053] -->
<h3 class="sectionedit9" id="declare_the_openid_connect_provider_in_llng">Déclarer le fournisseur OpenID Connect dans LL::NG</h3>
<div class="level3">
<p>
Dans le manager, choisir <code>Fournisseurs OpenID-Connect</code> et cliquer sur <code>Ajouter un fournisseur OpenID-Connect</code>. Donner un nom technique (sans espaces ni caratères speciaux), tel “sample-op” ;
</p>
<p>
On peut ensuite accéder à la configuration de cet OP.
</p>
</div>
<h4 id="metadata">Métadonnée</h4>
<div class="level4">
<p>
L'OP peut publier sa métadonnée dans un fichier JSON (voir par exemple la <a href="https://accounts.google.com/.well-known/openid-configuration" class="urlextern" title="https://accounts.google.com/.well-known/openid-configuration" rel="nofollow">métadonnée Google</a>). Copier le contenu de ce fichie dans l'emplacement dédié.
</p>
<p>
À défaut de métadonnée, il faut les écrire. Les champs obligatoires sont :
</p>
<ul>
<li class="level1"><div class="li"> issuer</div>
</li>
<li class="level1"><div class="li"> authorization_endpoint</div>
</li>
<li class="level1"><div class="li"> token_endpoint</div>
</li>
<li class="level1"><div class="li"> userinfo_endpoint</div>
</li>
</ul>
<p>
On peut aussi définir :
</p>
<ul>
<li class="level1"><div class="li"> jwks_uri</div>
</li>
<li class="level1"><div class="li"> endsession_endpoint</div>
</li>
</ul>
<p>
Modèle exemple :
</p>
<pre class="code file javascript"><span class="br0">{</span>
<span class="st0">"issuer"</span><span class="sy0">:</span> <span class="st0">"https://auth.example.com/"</span><span class="sy0">,</span>
<span class="st0">"authorization_endpoint"</span><span class="sy0">:</span> <span class="st0">"https://auth.example.com/oauth2/authorize"</span><span class="sy0">,</span>
<span class="st0">"token_endpoint"</span><span class="sy0">:</span> <span class="st0">"https://auth.example.com/oauth2/token"</span><span class="sy0">,</span>
<span class="st0">"userinfo_endpoint"</span><span class="sy0">:</span> <span class="st0">"https://auth.example.com/oauth2/userinfo"</span><span class="sy0">,</span>
<span class="st0">"end_session_endpoint"</span><span class="sy0">:</span><span class="st0">"https://auth.example.com/oauth2/logout"</span>
<span class="br0">}</span></pre>
</div>
<h4 id="jwks_data">Donnée JWKS</h4>
<div class="level4">
<p>
JWKS est un fichier JSON contenant des clefs publiques. <abbr title="LemonLDAP::NG">LL::NG</abbr> 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é.
</p>
<div class="notetip">Si le fournisseur OpenID-Connect n'utilise qu'une clef symétrique de chiffrement, la donnée JWKS n'est pas nécessaire.
</div>
</div>
<h4 id="exported_attributes">Attributs exportés</h4>
<div class="level4">
<p>
Définir ici la correspondance entre le contenu de la sessions <abbr title="LemonLDAP::NG">LL::NG</abbr> et les champs fournis dans la réponse UserInfo. Les champs sont définis dans le <a href="http://openid.net/specs/openid-connect-core-1_0.html#StandardClaims" class="urlextern" title="http://openid.net/specs/openid-connect-core-1_0.html#StandardClaims" rel="nofollow">standard OpenID-Connect</a>, et dépendent de la portée requise par <abbr title="LemonLDAP::NG">LL::NG</abbr> (voir les options dans le prochain chapitre).
</p>
</div><!-- EDIT10 PLUGIN_INCLUDE_START_NOREDIRECT "documentation:2.0:openidconnectclaims" [0-] -->
<div class="plugin_include_content plugin_include__documentation:2.0:openidconnectclaims" id="plugin_include__documentation__2.0__openidconnectclaims">
<div class="level1">
<div class="table sectionedit12"><table class="inline table table-bordered table-striped">
<thead>
<tr class="row0 roweven">
<th class="col0"> Nom affiché </th><th class="col1"> Type </th><th class="col2"> Exemple de correspondance d'attributs LDAP </th>
</tr>
</thead>
<tr class="row1 rowodd">
<td class="col0"> sub </td><td class="col1"> chaîne </td><td class="col2"> uid </td>
</tr>
<tr class="row2 roweven">
<td class="col0"> nom </td><td class="col1"> chaîne </td><td class="col2"> cn </td>
</tr>
<tr class="row3 rowodd">
<td class="col0"> given_name </td><td class="col1"> chaîne </td><td class="col2"> givenName </td>
</tr>
<tr class="row4 roweven">
<td class="col0"> family_name </td><td class="col1"> chaîne </td><td class="col2"> sn </td>
</tr>
<tr class="row5 rowodd">
<td class="col0"> middle_name </td><td class="col1"> chaîne </td><td class="col2"> </td>
</tr>
<tr class="row6 roweven">
<td class="col0"> nickname </td><td class="col1"> chaîne </td><td class="col2"> </td>
</tr>
<tr class="row7 rowodd">
<td class="col0"> preferred_username </td><td class="col1"> chaîne </td><td class="col2"> displayName </td>
</tr>
<tr class="row8 roweven">
<td class="col0"> profile </td><td class="col1"> chaîne </td><td class="col2"> labeledURI </td>
</tr>
<tr class="row9 rowodd">
<td class="col0"> picture </td><td class="col1"> chaîne </td><td class="col2"> </td>
</tr>
<tr class="row10 roweven">
<td class="col0"> website </td><td class="col1"> chaîne </td><td class="col2"> </td>
</tr>
<tr class="row11 rowodd">
<td class="col0"> email </td><td class="col1"> chaîne </td><td class="col2"> mail </td>
</tr>
<tr class="row12 roweven">
<td class="col0"> email_verified </td><td class="col1"> boolean </td><td class="col2"> </td>
</tr>
<tr class="row13 rowodd">
<td class="col0"> gender </td><td class="col1"> chaîne </td><td class="col2"> </td>
</tr>
<tr class="row14 roweven">
<td class="col0"> birthdate </td><td class="col1"> chaîne </td><td class="col2"> </td>
</tr>
<tr class="row15 rowodd">
<td class="col0"> zoneinfo </td><td class="col1"> chaîne </td><td class="col2"> </td>
</tr>
<tr class="row16 roweven">
<td class="col0"> locale </td><td class="col1"> chaîne </td><td class="col2"> preferredLanguage </td>
</tr>
<tr class="row17 rowodd">
<td class="col0"> phone_number </td><td class="col1"> chaîne </td><td class="col2"> telephoneNumber </td>
</tr>
<tr class="row18 roweven">
<td class="col0"> phone_number_verified </td><td class="col1"> boolean </td><td class="col2"> </td>
</tr>
<tr class="row19 rowodd">
<td class="col0"> updated_at </td><td class="col1"> chaîne </td><td class="col2"> </td>
</tr>
<tr class="row20 roweven">
<td class="col0"> formatted </td><td class="col1"> chaîne </td><td class="col2"> registeredAddress </td>
</tr>
<tr class="row21 rowodd">
<td class="col0"> street_address </td><td class="col1"> chaîne </td><td class="col2"> street </td>
</tr>
<tr class="row22 roweven">
<td class="col0"> locality </td><td class="col1"> chaîne </td><td class="col2"> l </td>
</tr>
<tr class="row23 rowodd">
<td class="col0"> region </td><td class="col1"> chaîne </td><td class="col2"> st </td>
</tr>
<tr class="row24 roweven">
<td class="col0"> postal_code </td><td class="col1"> chaîne </td><td class="col2"> postalCode </td>
</tr>
<tr class="row25 rowodd">
<td class="col0"> country </td><td class="col1"> chaîne </td><td class="col2"> co </td>
</tr>
</table></div><!-- EDIT12 TABLE [38-861] -->
</div><!-- EDIT11 PLUGIN_INCLUDE_END "documentation:2.0:openidconnectclaims" [0-] -->
</div>
<div class="level4">
<p>
Ainsi on peut définir par exemple:
</p>
<ul>
<li class="level1"><div class="li"> cn ⇒ name</div>
</li>
<li class="level1"><div class="li"> sn ⇒ family_name</div>
</li>
<li class="level1"><div class="li"> mail ⇒ email</div>
</li>
<li class="level1"><div class="li"> uid ⇒ sub</div>
</li>
</ul>
</div>
<h4 id="options">Options</h4>
<div class="level4">
<ul>
<li class="level1"><div class="li"> <strong>Configuration</strong> :</div>
<ul>
<li class="level2"><div class="li"> <strong>Configuration endpoint</strong>: <abbr title="Uniform Resource Locator">URL</abbr> de point d'accès de configuration de l'OP</div>
</li>
<li class="level2"><div class="li"> <strong>Durée de vie de la donnée JWKS</strong> : au delà de ce délai, <abbr title="LemonLDAP::NG">LL::NG</abbr> effectuera une requête pour rafraîchir la donnée JWKS. Mettre à 0 pour désactiver.</div>
</li>
<li class="level2"><div class="li"> <strong>Identifiant client</strong> : identifiant client donné par l'OP</div>
</li>
<li class="level2"><div class="li"> <strong>Secret client</strong> : secret client donné par l'OP</div>
</li>
<li class="level2"><div class="li"> <strong>Store ID token</strong>: 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.</div>
</li>
</ul>
</li>
<li class="level1"><div class="li"> <strong>Protocole</strong> :</div>
<ul>
<li class="level2"><div class="li"> <strong>Portée</strong> : valeur du paramètre de portée (exemple : profil openid). La portée <code>openid</code> est exigée.</div>
</li>
<li class="level2"><div class="li"> <strong>Affichage</strong> : valeur du paramètre d'affichage (exemple : page)</div>
</li>
<li class="level2"><div class="li"> <strong>Prompt</strong> : valeur du paramètre prompt (exemple : consent)</div>
</li>
<li class="level2"><div class="li"> <strong>Âge max</strong> : valeur du paramètre max_age (exemple : 3600)</div>
</li>
<li class="level2"><div class="li"> <strong>UI locales</strong> : valeur du paramètre ui_locales (exemple : en-<abbr title="Gigaoctet">GB</abbr> en fr-FR fr)</div>
</li>
<li class="level2"><div class="li"> <strong>Valeurs ACR</strong> : valeur des paramètres acr_values (exemple : loa-1)</div>
</li>
<li class="level2"><div class="li"> <strong>Méthode d'authentification du point d'accès du jeton</strong> : choisir entre <code>client_secret_post</code> et <code>client_secret_basic</code></div>
</li>
<li class="level2"><div class="li"> <strong>Vérifier la signature JWT</strong> : mettre à 0 pour désactiver la signature JWT</div>
</li>
<li class="level2"><div class="li"> <strong>Durée de vie max des jetons</strong> : si défini, <abbr title="LemonLDAP::NG">LL::NG</abbr> examinera la date du jeton d'identification et refusera les jetons trop anciens</div>
</li>
<li class="level2"><div class="li"> <strong>Utiliser Nonce</strong> : si activé, un nonce sera envoyé, et vérifié depuis le jeton d'identité</div>
</li>
</ul>
</li>
<li class="level1"><div class="li"> <strong>Affichage</strong> :</div>
<ul>
<li class="level2"><div class="li"> <strong>Nom affiché</strong> : nom de l'application</div>
</li>
<li class="level2"><div class="li"> <strong>Logo</strong> : logo de l'application</div>
</li>
</ul>
</li>
</ul>
</div><!-- EDIT9 SECTION "Declare the OpenID Connect Provider in LL::NG" [3054-] -->
</div>
</body>
</html>