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
  4. licence : tous droits réservés - all rights reserved
  5. Copyright (c) 2021 DnC
  6. Copyright (c) 2021 i-Tego (TM)
  7. ]
  8. [(#ENV{token}|autoconnect{#SELF}|non)        
  9.     [(#SESSION{id_auteur}|non)
  10.         <:oauth:vous_devez_vous_identifier:>.<br />
  11.         <:oauth:vous_pas_compte:> <a href="./spip.php?page=inscription&lang=#ENV{lang}"><:oauth:creer_compte_auteur:></a><br />
  12.         <br />
  13.         #LOGIN_PUBLIC
  14.     ]
  15. ]

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
  5. * @licence : tous droits réservés - all rights reserved
  6. * @copyright (c) 2021 DnC
  7. * @copyright (c) 2021 i-Tego (TM)
  8. */
  9.  
  10. //[dnc150b]
  11.  
  12. /**
  13. * Lancer une (re)connexion par la méthode OIDC id_token_hint avec le token fourni.
  14. * Ceci suppose que la dernière connexion de l'utilisateur ait été enregistrée dans la table jwt.
  15. * La table jwt est indexée par le hash de l'ID Token.
  16. * C'est cette valeur, plus courte que l'ID token lui-même, qui est passée dans l'URL d'autoconnexion.
  17. *
  18. * @param mixed $idt_hash : le hash de l'ID Token
  19. */
  20. function filtre_autoconnect_dist( $idt_hash, $url=null ) {
  21.    
  22.     //DebugBreak("435347910947900005@127.0.0.1;d=1");  //DEBUG
  23.    
  24.     // Récupérer l'ID Token et le client avec idt_hash
  25.     include_spip('base/abstract_sql');
  26.     $res = sql_fetsel('client_id, id_token', 'spip_jwt', 'idt_hash=' . sql_quote($idt_hash));
  27.    
  28.     if ( ! is_null($res) ) {
  29.         // Générer un state
  30.         include_spip('inc/session');
  31.         $state = md5($idt_hash);    
  32.         $state= substr($state, 0, 16);
  33.         session_set('state', $state);
  34.        
  35.         // Page à laquelle rediriger après l'authentification.
  36.         if ( empty($url) ) $url = './';  
  37.         $url = parametre_url($url, 'token', '');  // sans le token évidemment (car il ne sera plus valide après la (re)connexion.
  38.         session_set('caller', $url);  // voir plugin oidcclient : oidc_setps.php.
  39.        
  40.         // lancer une (re)connexion par la méthode OIDC id_token_hint
  41.         $redirect = '/authorize';
  42.         $redirect = parametre_url($redirect, 'response_type', 'code', '&');
  43.         $redirect = parametre_url($redirect, 'scope', 'openid sli', '&');
  44.         $redirect = parametre_url($redirect, 'prompt', 'none', '&');
  45.         $redirect = parametre_url($redirect, 'client_id', $res['client_id'], '&');
  46.         $redirect = parametre_url($redirect, 'state', $state, '&');
  47.         $redirect = parametre_url($redirect, 'url', $url, '&');
  48.         $redirect = parametre_url($redirect, 'id_token_hint', $res['id_token'], '&');
  49.         include_spip('inc/headers');
  50.         redirige_par_entete($redirect);  
  51.    
  52.     } else {
  53.         // idt_hash non valide ou erreur plus générale.
  54.         return ""; // pour faire échouer le test
  55.     }
  56.          
  57. }

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.