Manuel:Comment déboguer/Problèmes de login

This page is a translated version of the page Manual:How to debug/Login problems and the translation is 100% complete.

Les problèmes de connexion ou de session (comme le fait de ne pas pouvoir se connecter, de se déconnecter immédiatement, de se déconnecter de manière aléatoire, de ne pas pouvoir modifier en raison d'erreurs de "perte de données de session") peuvent être causés par une grande variété de raisons, ce qui rend le débogage difficile.

Lorsque vous recherchez ou signalez des erreurs, voici quelques conseils.

Pour les utilisateurs

  • Si le problème est de ne pas pouvoir de vous connecter à cause d'erreurs du type Il semble y avoir un problème avec votre session de connexion..., l'effacement de tous les cookies pour ce site aide généralement.
  • Lorsque vous rédigez un rapport de bogue, indiquez toujours le navigateur (et sa version) que vous utilisez, si vous l'utilisez en mode incognito et si vous utilisez des paramètres de confidentialité ou de sécurité non par défaut (comme bloquer les cookies tiers).
    • Lorsque c'est possible, joignez la date et l'heure précises à laquelle vous avez rencontré le problème, afin qu'il puisse être retrouvé dans les journaux du système.
  • Vous n'avez pas besoin de faire une enquête approfondie mais juste déposer un rapport de bogue, et si vous le voulez, voici quelques types d'informations qui sont généralement utiles :
    • Est-ce qu'il persiste après avoir effacé les cookies pour le domaine du wiki ? Lors de la connexion utilisez-vous le mode incognito du navigateur ? Lorsque vous vous connectez avec un autre type de navigateur ?
    • Si vous utilisez des bloqueurs de publicité ou des modules complémentaires de confidentialité du navigateur, bloquent-ils quoi que ce soit ? Est-ce que ça marche si vous les désactivez ?
    • Cela affecte-t-il plusieurs comptes utilisateurs, ou bien un seul ?
    • Le drapeau "Souviens-toi de moi" fait-il une différence ? (Effacer les cookies avant les tentatives).
    • Si les problèmes se produisent sur un wiki Wikimedia, essayez de vous connecter sur un autre wiki, de préférence celui qui ne partage pas un nom de domaine de second niveau (donc si le problème se produit sur xy.wikipedia.org, essayez par exemple avec xy.wiktionary.org).
    • Si les informations ci-dessus ne sont pas suffisantes pour analyser le problème (ce qui est souvent le cas), vous allez avoir besoin de demander à récupérer les données détaillées de débogage. Pour cela, vous devez capturer les requêtes et les réponses HTTP pertinentes (c.-à-d. visiter la page de connexion + soumettre le formulaire de connexion + la redirection résultante; et si le wiki utilise la connexion unique, toutes les requêtes à Special:CentralLogin et Special:CentralAutoLogin aussi). Cela peut être fait en utilisant l'onglet Réseau dans les Outils de développement de votre navigateur web (plus d'informations: Firefox, Internet Explorer, Chrome et Chromium, Safari). Le vidage dans un fichier HAR est un moyen facile d'enregistrer toutes les données requises.
      • Notez bien que cela inclut des données sensibles à la sécurité (comme votre identifiant de session); lorsque vous partagez les informations dans le cadre d'un rapport de bogue, vous devez utiliser un collage privé (accès réservé aux développeurs). Vous êtes encouragé à supprimer votre mot de passe du rapport (dans le cas d'un fichier HAR, vous pouvez simplement l'ouvrir sous forme de fichier texte, rechercher le mot de passe et le remplacer par autre chose) et à vous déconnecter et à vous connecter à nouveau par la suite.

Pour les développeurs

Lorsque vous déboguez les problèmes de connexion à MediaWiki par défaut, recherchez les éléments suivants :

  • Sur Special:Userlogin, est-ce que le site web a défini le cookie <wikiID>Session ? Le cookie est-il renvoyé correctement lorsque le formulaire de connexion est soumis ? Est-ce que la valeur du cookie persiste durant la connexion en plusieurs étapes (comme 2FA) ? La session existe-t-elle sur le serveur (vouspouvez vérifier avec ObjectCache::getInstance( $wgSessionCacheType ) )->get( "MWSession:$sessionCookieValue" ), en utilisant shell.php ).
    • Si vous débogagez un login basé sur l'API, le cookie doit être configuré par la réponse à meta=tokens et renvoyé dans la requête action=login. Les clients qui ne le font pas sont la source la plus fréquente d'erreurs de connexion. (Notez que la meilleure pratique pour les robots et les clients similaires est d'utiliser les consommateurs propriétaires uniquement et de ne pas du tout utiliser le login).
  • Après un login réussi, est-ce que les cookies <wikiID>Session, <wikiID>UserName, <wikiID>UserId, <wikiID>Token sont-ils définis ? (ce dernier n'existe que lorsque si la case à cocher "Rester connecté" a été utilisée) Les champs userId / userName / userToken correspondent-ils aux données stockées sur le serveur ? Le jeton correspond-il à la valeur de user.user_token dans la base de données ?
  • Si vous voulez vérifier des choses avec un débogueur comme XDebug, pour les problèmes de session ou de cookies, les parties intéressantes sont généralement la méthode provideSessionInfo() du fournisseur de session (généralement CookieSessionProvider), et SessionManager::loadSessionInfoFromStore. Pour les problèmes de traitement de la demande de connexion envoyée, il s'agit de AuthManager::continueAuthentication() et des méthodes getAuthenticationRequests() et beginPrimaryAuthentication() du fournisseur d'authentification primaire (par défaut LocalPasswordPrimaryAuthenticationProvider). Notez que ces bases de code sont particulièrement complexes et seront difficiles à comprendre si vous n'êtes pas familier avec SessionsManager et AuthManager.
  • Voir aussi les conseils de connexion pour la prochaine session.

Lorsque vous déboguez CentralAuth (par exemple, les sites Wikimedia), les éléments à rechercher sont :

  • En plus des cookies normaux, il doit y avoir également centralauth_Session, centralauth_User et (avec l'option "Rester connecté") centralauth_Token (typiquement initialisé sur le domaine parent). Ces cookies devraient suffire à recréer les autres cookies quand ceux-ci sont absents. Le cookie de session correspond à la session centrale; ses données peuvent être vérifiées avec MediaWiki\MediaWikiServices::getInstance()->get( 'CentralAuth.CentralAuthSessionManager')->getCentralSessionById( $sessionCookieValue ) (en utilisant shell.php ). Le jeton correspond à globaluser.gu_auth_token dans la base de données partagée de CentralAuth.
  • Après un login réussi, il doit y avoir une chaîne de redirections Special:CentralLogin/startSpecial:CentralLogin/complete → retour à la page initiale (ou à la cible de returnTo). L'étape /start configure une session centrale bouchon et définit les cookies pour le domaine central; l'étape /complete finalise la session centrale et définit les cookies pour le domaine local. (Voir phpdoc dans SpecialCentralLogin pour une description plus détaillée). Les cookies sont-ils émis comme prévu ? Le navigateur les conserve-t-il vraiment ? Les données stockées dans le serveur de la session centrale sont-elles correctes ? Si cette étape ne fonctionne pas, le login final ou l'autologin ne fonctionneront pas non plus.
    • La marque "Rester connecté" (c'est-à-dire le cookie centralauth_Token) est défini dans une étape séparée, par une requête à Special:CentralAutoLogin/refreshCookies qui est déclenchée à partir d'une balise ‎<img> lorsque le reste de l'autologin est terminé. Les cookies sont-ils émis ? Le navigateur les conserve-t-il vraiment ? Lorsque cette étape ne fonctionne pas, le login final ou l'autologin cessent de fonctionner lorsque la session centrale expire (dans un jour ou plus).
  • Juste après le login central, le login final est déclenché: pour chaque wiki de $wgCentralAuthAutoLoginWikis, il existe une chaîne de redirection vers les différentes sous-pages de Special:CentralAutologin (/start → /checkLoggedIn → /createSession → /validateSession → /setCookies) via une image intégrée à la page. L'étape setCookies doit créer une session locale et définir les cookies de session. Les cookies sont-ils émis ? Le navigateur les conserve-t-il vraiment ?
  • Lorsque vous visitez un wiki où vous n'avez pas de session active (et aucun cookie partagé sur le domaine parent pour en créer un), l'autologin central est déclenché. C'est essentiellement la même chose que le login final, juste dans une balise de script au lieu d'une balise d'image, et les mêmes choses doivent être vérifiées.
    • Lorsque l'autologin central échoue, les autres tentatives sont bloquées si le drapeau localStorage CentralAuthAnon est défini; vous devrez peut-être supprimer cela lors du test.
  • Lorsqu'une personne visite la page de connexion sans avoir ouvert de session, un autologin de haut niveau est déclenché. C'est fondamentalement la même chose que l'autologin normal, simplement en redirigeant la page complète, au lieu qu'une image intégrée ne fasse les redirections, et les mêmes éléments doivent être vérifiés.

Il existe une vue d'ensemble des fonctionnalités d'authentification disponibles de CentralAuth.

Pour les administrateurs de site

  • Vérifiez quel serveur de session est utilisé ($wgSessionCacheType ) et assurez-vous qu'il fonctionne (les données sont en fait conservées entre les requêtes). La configuration la plus sûre est $wgSessionCacheType = CACHE_DB;. Si vous n'êtes pas sûr de la façon dont il est configuré, ajoutez ce paramètre à la fin de votre LocalSettings.php.
  • Assurez-vous que session.auto_start n'est pas défini à 1 ou à true, autrement les sessions de PHP écraseront celles de MediaWiki. (tâche T159567)
  • Assurez-vous que session.referer_check est défini à une chaîne vide. S'il est mal configuré, il marque les sessions comme étant invalides.
  • S'il est défini, assurez-vous que $wgCookieDomain et $wgCookiePath sont corrects.
  • Si $wgCookieSecure est défini à true, votre serveur web doit utiliser HTTPS.
  • Assurez-vous que le nom des hôtes correspond dans MediaWiki et Apache httpd.conf. Par exemple, pour le domaine example.com et le serveur web situé à www.example.com :
    # LocalSettings.php
    $wgServer           = '//www.example.com';
    $wgCanonicalServer  = 'https://www.example.com';
    $wgSitename         = 'Example Wiki';
    
    $wgSecureLogin      = true;
    $wgCookieHttpOnly   = true;
    $wgCookieSecure     = 'detect';
    
    Et :
    # httpd.conf
    <VirtualHost *:80>
       ...
       ServerName example.com
       ServerAlias www.example.com *.example.com
       Redirect permanent / https://example.com/
       ...
    </VirtualHost>
    
    <VirtualHost *:443>
       ...
       SSLEngine on
       ServerName example.com
       ServerAlias www.example.com *.example.com
       ...
    </VirtualHost>
    
  • Si vous faites un rapport de bogue :
    • Rapportez quelle version de MediaWiki vous utilisez et quels fournisseurs de session vous utilisez (valeur de $wgSessionProviders ).
    • Vérifiez vos journaux pour les enregistrements pertinents, en particulier les canaux authentication, session, cookie, objectcache (en plus des canaux habituels exception, error, fatal). En plus, captcha si vous recherchez les problèmes de CAPTCHA, et CentralAuth si vous utilisez cette extension.
    • Pour certains types de cache vous pouvez obtenir plus d'informations en initialisant le mode de débogage :
      $wgHooks['SetupAfterCache'][] = function () {
          global $wgSessionCacheType;
          ObjectCache::getInstance( $wgSessionCacheType )->setDebug( true );
      };
      
    • Veuillez ne pas réutiliser les anciens rapports de bogue à moins que vous ne soyez sûr qu'il s'agit de la même cause. Il y a beaucoup de rapports sur les problèmes passés, et les symptômes de l'événement semblent similaires aux vôtres (il existe de multiples façons pour que la connexion échoue) la cause est susceptible d'être différente.