Plutôt que faire figurer le jeton d’identité dans le lien, qui peut être trop grand pour être passé en URL, on prendra l’ID Token dans une table où il se trouve indexé par son hash, et ce sera cette valeur qui sera passée dans le lien de reconnexion.
En tête de chaque page pouvant être appelée avec reconnexion, on appellera avec :
- <INCLURE{fond=inclure/autoconnect}{env}>
la noisette suivante :
SPIP
- [(#REM) 150b Autoconnect : connexion OIDC avec la méthode id_token_hint
- Remplace la noisette identification pour assurer l'authentification avec l’ID Token passé par le paramètre d'URL token
- auteur : B.Degoy i-Tego
- licence : GNU/GPL
- ]
- [(#ENV{token}|autoconnect{#SELF}|non)
- [(#SESSION{id_auteur}|non)
- <:oauth:vous_devez_vous_identifier:>.<br />
- <:oauth:vous_pas_compte:> <a href="./spip.php?page=inscription&lang=#ENV{lang}"><:oauth:creer_compte_auteur:></a><br />
- <br />
- #LOGIN_PUBLIC
- ]
- ]
Voici le code du filtre autoconnect :
PHP SPIP
- <?php
- /**
- * Autoconnect pour DnC SaaS (base SPIP)
- * @auteur : B.Degoy i-Tego
- * SPIP, Systeme de publication pour l'internet
- * Copyright (c) 2001-2020
- * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James
- * Ce programme est un logiciel libre distribue sous licence GNU/GPL.
- * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.
- */
- //[dnc150b]
- /**
- * Lancer une (re)connexion par la méthode OIDC id_token_hint avec le token fourni.
- * Ceci suppose que la dernière connexion de l'utilisateur ait été enregistrée dans la table jwt.
- * La table jwt est indexée par le hash de l'ID Token.
- * C'est cette valeur, plus courte que l'ID token lui-même, qui est passée dans l'URL d'autoconnexion.
- *
- * @param mixed $idt_hash : le hash de l'ID Token
- */
- function filtre_autoconnect_dist( $idt_hash, $url=null ) {
- //DebugBreak("435347910947900005@127.0.0.1;d=1"); //DEBUG
- // Récupérer l'ID Token et le client avec idt_hash
- include_spip('base/abstract_sql');
- $res = sql_fetsel('client_id, id_token', 'spip_jwt', 'idt_hash=' . sql_quote($idt_hash));
- // Générer un state
- include_spip('inc/session');
- session_set('state', $state);
- // Page à laquelle rediriger après l'authentification.
- $url = parametre_url($url, 'token', ''); // sans le token évidemment (car il ne sera plus valide après la (re)connexion.
- session_set('caller', $url); // voir plugin oidcclient : oidc_setps.php.
- // lancer une (re)connexion par la méthode OIDC id_token_hint
- $redirect = '/authorize';
- $redirect = parametre_url($redirect, 'response_type', 'code', '&');
- $redirect = parametre_url($redirect, 'scope', 'openid sli', '&');
- $redirect = parametre_url($redirect, 'prompt', 'none', '&');
- $redirect = parametre_url($redirect, 'client_id', $res['client_id'], '&');
- $redirect = parametre_url($redirect, 'state', $state, '&');
- $redirect = parametre_url($redirect, 'url', $url, '&');
- $redirect = parametre_url($redirect, 'id_token_hint', $res['id_token'], '&');
- include_spip('inc/headers');
- redirige_par_entete($redirect);
- } else {
- // idt_hash non valide ou erreur plus générale.
- return ""; // pour faire échouer le test
- }
- }
Cette procédure de reconnexion revient exactement à une nouvelle connexion de l’utilisateur. Cela veut dire en particulier que le cookie SLI et les jetons seront régénérés.
Comme le jeton d’identité change, son hash change et il en résulte que le jeton passé dans le lien de reconnexion est à usage unique.