Accueil > OpenID Connect OAuth Serveur dédié > Développer > OpenID Connect > Lien de (re)connexion

Lien de (re)connexion Une application de id_token_hint

Il peut être utile de permettre à un utilisateur de se connecter sans passer par une procédure d’identification. Par exemple lorsque le login ou le mot de passe a été perdu et pour éviter la fastidieuse procédure de récupération du "mot de passe oublié".

Nous décrivons ici comment créer un lien de reconnexion qui pourra, par exemple, être adressé à l’utilisateur dans un e-mail.

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 :

  1. <INCLURE{fond=inclure/autoconnect}{env}>

la noisette suivante :

SPIP

  1. [(#REM) 150b Autoconnect : connexion OIDC avec la méthode id_token_hint
  2. Remplace la noisette identification pour assurer l'authentification avec l’ID Token passé par le paramètre d'URL token
  3. auteur : B.Degoy i-Tego
  4. licence : GNU/GPL
  5. ]
  6. [(#ENV{token}|autoconnect{#SELF}|non)        
  7.     [(#SESSION{id_auteur}|non)
  8.         <:oauth:vous_devez_vous_identifier:>.<br />
  9.         <:oauth:vous_pas_compte:> <a href="./spip.php?page=inscription&lang=#ENV{lang}"><:oauth:creer_compte_auteur:></a><br />
  10.         <br />
  11.         #LOGIN_PUBLIC
  12.     ]
  13. ]

Télécharger

Voici le code du filtre autoconnect :

PHP SPIP

  1. <?php
  2. /**
  3.  * Autoconnect pour DnC SaaS (base SPIP)
  4.  * @auteur : B.Degoy i-Tego
  5.  *  SPIP, Systeme de publication pour l'internet                            
  6.  *  Copyright (c) 2001-2020
  7.  *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James                          
  8.  *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.  
  9.  *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.
  10. */
  11.  
  12. //[dnc150b]
  13.  
  14. /**
  15. * Lancer une (re)connexion par la méthode OIDC id_token_hint avec le token fourni.
  16. * Ceci suppose que la dernière connexion de l'utilisateur ait été enregistrée dans la table jwt.
  17. * La table jwt est indexée par le hash de l'ID Token.
  18. * C'est cette valeur, plus courte que l'ID token lui-même, qui est passée dans l'URL d'autoconnexion.
  19. *
  20. * @param mixed $idt_hash : le hash de l'ID Token
  21. */
  22. function filtre_autoconnect_dist( $idt_hash, $url=null ) {
  23.    
  24.     //DebugBreak("435347910947900005@127.0.0.1;d=1");  //DEBUG
  25.    
  26.     // Récupérer l'ID Token et le client avec idt_hash
  27.     include_spip('base/abstract_sql');
  28.     $res = sql_fetsel('client_id, id_token', 'spip_jwt', 'idt_hash=' . sql_quote($idt_hash));
  29.    
  30.     if ( ! is_null($res) ) {
  31.         // Générer un state
  32.         include_spip('inc/session');
  33.         $state = md5($idt_hash);    
  34.         $state= substr($state, 0, 16);
  35.         session_set('state', $state);
  36.        
  37.         // Page à laquelle rediriger après l'authentification.
  38.         if ( empty($url) ) $url = './';  
  39.         $url = parametre_url($url, 'token', '');  // sans le token évidemment (car il ne sera plus valide après la (re)connexion.
  40.         session_set('caller', $url);  // voir plugin oidcclient : oidc_setps.php.
  41.        
  42.         // lancer une (re)connexion par la méthode OIDC id_token_hint
  43.         $redirect = '/authorize';
  44.         $redirect = parametre_url($redirect, 'response_type', 'code', '&');
  45.         $redirect = parametre_url($redirect, 'scope', 'openid sli', '&');
  46.         $redirect = parametre_url($redirect, 'prompt', 'none', '&');
  47.         $redirect = parametre_url($redirect, 'client_id', $res['client_id'], '&');
  48.         $redirect = parametre_url($redirect, 'state', $state, '&');
  49.         $redirect = parametre_url($redirect, 'url', $url, '&');
  50.         $redirect = parametre_url($redirect, 'id_token_hint', $res['id_token'], '&');
  51.         include_spip('inc/headers');
  52.         redirige_par_entete($redirect);  
  53.    
  54.     } else {
  55.         // idt_hash non valide ou erreur plus générale.
  56.         return ""; // pour faire échouer le test
  57.     }
  58.          
  59. }

Télécharger

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.