Dépannage des erreurs d’état non valide des plugins WordPress
Nous avons ajouté la validation des états à la version 3.6.0 du plugiciel WordPress, qui se trouve dans le dépôt GitHub wp-auth0. Cette mesure de sécurité permet d’atténuer les attaques CSRF en garantissant que la réponse correspond à une demande initiée par le même utilisateur. Pour en savoir plus, consultez Prévenir les attaques et rediriger les utilisateurs avec le paramètre d’état OAuth 2.0.
Fonctionnement de la validation des états
Le plugin effectue la validation d’état en :
Définissant un témoin
auth0_state
dans le navigateur à partir de Javascript lorsque le formulaire de connexion Lock est affiché (surwp-login.php
ou sur toute autre page lorsque vous utilisez un code court ou un gadget logiciel).Transmettant cette valeur au formulaire de connexion intégré Lock afin qu’elle soit envoyée avec la demande d’authentification.
Recevant cette valeur inchangée d’Auth0 dans un paramètre URL
state
si la connexion Auth0 a été réussie.Validant que la valeur reçue correspond à la valeur envoyée et stockée dans le témoin
auth0_state
. Si la valeur est valide, le processus de connexion se poursuit. Dans le cas contraire, le processus s’arrête et le message d’erreur « État non valide » s’affiche.Suppression du témoin, quelle que soit sa validité.
Utilisation des valeurs de l’objet décodé en base64 pour rediriger ou effectuer d’autres actions de connexion, si elles sont valides.
Ce processus doit être totalement opaque pour l’utilisateur qui se connecte et pour l’administrateur du site. Le serveur Auth0 ne valide pas ou n’exige pas de valeur d’état et la renvoie intacte à l’URL de rappel. Si le message « État non valide » s’affiche, c’est que l’une des quatre premières étapes ci-dessus a échoué.
Causes courantes de l’erreur « État non valide »
Vous trouverez ci-dessous les causes les plus courantes de l’erreur « État non valide » ainsi que les mesures de dépannage que vous pouvez prendre.
URL de rappel mis en cache
La cause la plus fréquente de l’erreur « État non valide » est la mise en cache de l’URL de rappel sur le serveur.
Excluez la mise en cache sur votre serveur pour toutes les URL indiquées dans le champ URL de rappel autorisées dans Dashboard Auth0 > Applications > Applications > Paramètres et testez à nouveau. En outre, excluez la mise en cache de l’URL du site (/index.php
sur une installation normale) si elle comporte un paramètre URL Auth0.
Vérifiez si l’heure de votre serveur est incorrecte. L’erreur BeforeValidException
peut se produire lorsque le jeton est perçu comme ayant été généré avant l’heure actuelle, ce qui peut se produire si l’heure du serveur est décalée. Vous pouvez vérifier l’heure de votre serveur en utilisant echo current_time( ’c’ )
. Une solution temporaire peut également consister à modifier le plugin pour ajouter un décalage horaire si vous ne parvenez pas à modifier l’heure du serveur, un problème qui devrait toutefois être résolu pour la production.
Si cela ne résout pas le problème, continuez avec les étapes de dépannage ci-dessous.
Témoins et paramètres URL mis en cache
Si vous êtes sur un hébergeur géré comme WP-Engine, vous devrez peut-être communiquer avec leur équipe de soutien pour obtenir de l’aide supplémentaire. On nous a signalé des problèmes d’accès aux témoins requis sur l’URL de rappel, ainsi que des problèmes de vérification de l’authentification sur la page finale que les utilisateurs voient après s’être connectés. Plus précisément, demandez que les exclusions de cache soient ajoutées pour :
Témoin :
auth0_state
Témoin :
auth0_nonce
Paramètre Arg/URL :
auth0
Paramètre Arg/URL :
code
Paramètre Arg/URL :
state
Paramètre Arg/URL :
id_token
Actualisation de la page après un message d’erreur
Si vous actualisez la page après avoir obtenu un autre message d’erreur (vérification de l’adresse électronique, etc.), le message "« État non valide » s’affichera pour tenter de revalider une valeur déjà utilisée. Ce comportement est normal.
Exigences en matière de noms de témoins
Certains hôtes, comme Pantheon, exigent que des noms de témoins spécifiques soient utilisés. Vous pouvez modifier le nom du témoin en utilisant le filtre auth0_state_cookie_name
dans votre thème ou dans un plugiciel personnalisé. Pour en savoir plus sur le filtre auth0_state_cookie_name
, consultez Plugin WordPress Extend Login by Auth0. Pour plus d’informations, consultez le problème GitHub associé et explorez son correctif.
Page de connexion universelle et création de liens
Si votre site utilise la page de connexion universelle et que vous créez vous-même le lien dans un thème ou un plugin, vous devez :
Définir un témoin appelé
auth0_state
avec une valeur générée de manière aléatoireEnvoyer cette valeur dans un paramètre URL
state
.
Vous pouvez également aller dans Paramètres > onglet Fonctionnalités > Page de connexion universelle et rediriger les demandes de connexion vers la page wp-login.php
où ce témoin et ce paramètre URL seront définis automatiquement. Si vous souhaitez continuer à utiliser une URL /authorize
personnalisée, vous pouvez afficher le code qui exécute ce processus dans le dépôt GitHub.
Visiter l’URL de rappel directement
Si vous visitez votre URL de rappel (typiquement yourdomain.com/index.php?auth0=1
) directement ou une seconde fois après l’échange du code d’autorisation, l’erreur « État non valide » peut s’afficher. Cela indique que l’état a déjà été vérifié et supprimé.
Dépannage des erreurs d’état non valide
Notez que certaines des étapes ci-dessous nécessiteront que le processus de connexion soit interrompu pendant le processus (marqué comme tel) :
Lorsque vous êtes déconnecté de WordPress et d’Auth0, visitez la page de connexion testée.
Vérifiez que le témoin
auth0_state
est défini (dans Chrome, Affichage > Développeur > Console JavaScript > Onglet Application > Stockage à gauche > Témoins > domaine testé, recherchez un témoinauth0_state
dont la valeur n’est pas vide).Si cette valeur n’est pas définie, vérifiez les erreurs dans la console JS et assurez-vous que votre navigateur accepte les témoins (la connexion ne fonctionnera pas sans témoins). Cette valeur est définie dans le fichier
/assets/js/lock-init.js
. Vous pouvez consulter ce code sur GitHub.Si la valeur est définie, copiez-la et affichez le code source de la page (dans Chrome, Affichage > Développeur > Afficher la source). Recherchez la valeur, qui doit être associée au paramètre
wpAuth0LockGlobal.settings.auth.params.state
(voir l’exemple JSON). Notez cette valeur (vous en aurez besoin à l’étape suivante).
Si la valeur apparaît et que le formulaire Lock se charge normalement, les étapes 1 et 2 de la première liste ci-dessus fonctionnent correctement.
Avant de vous connecter, ajoutez cet extrait de code en haut de votre
wp-config.php
, afin de pouvoir effectuer une installation test. ATTENTION : cette opération interrompra la connexion pour le site WordPress testé, donc utilisez-la uniquement sur une installation hors production.Connectez-vous normalement.
Une fois redirigé vers l’URL de rappel de votre site, le processus s’arrête. Vous devriez voir une sortie comme celle montrée dans le contenu essentiel (Gist) de l’étape 4 ci-dessus. Si vous voyez quelque chose comme
Array()
sans aucune valeur supplémentaire, l’une des deux choses suivantes peut se produire :L’URL de rappel WordPress est mise en cache. La mise en cache des pages peut se faire de différentes manières, raison pour laquelle nous ne pouvons pas vous fournir de marche à suivre explicite. Vérifiez les plugins de mise en cache que vous avez installés, ils intègrent généralement une forme d’exclusion d’URL. Vérifiez également auprès de votre hébergeur que la mise en cache peut être automatisée et nécessiter l’intervention du service d’assistance.
Le serveur ne lit pas le témoin Auth0. Pour trouver une solution possible, consultez le problème GitHub associé et explorez son correctif.
Si les valeurs sont présentes, vérifiez les en-têtes de réponse pour l’URL de rappel chargée (dans Chrome, Affichage > Développeur > Console JavaScript > Onglet Réseau, cliquez sur le premier « document » listé avec un statut 500 et recherchez « En-têtes de réponse »). Recherchez ici toute preuve de mise en cache, comme un
Cache-Control
avec unmax-age
non nul, unx-cache
autre queMISS
, ou tout autre indice montrant que cette page est servie à partir d’un cache.Dans les en-têtes de réponse, vérifiez également que
set-cookie
inclut une directive telle queauth0_state=deleted
pour confirmer que le processus de validation a bien lieu.Assurez-vous que le paramètre
state
dans l’URL correspond à celui enregistré dans le témoin défini à l’étape 3 ci-dessus.Si aucune trace de mise en cache n’est visible, supprimez l’extrait de débogage de
wp-config.php
et actualisez l’URL de rappel. Vous devriez voir à nouveau le message « Invalid state (État non valide) ». Si des modifications ont été apportées à la mise en cache, effectuez le processus de connexion dans son intégralité (veillez à effacer les témoins et le cache de votre navigateur avant de procéder au test).
Les étapes de dépannage suivantes nécessitent des modifications du plugin qui interrompront le processus de connexion et devront être annulées une fois terminées. Ces étapes doivent être effectuées sur un serveur de test ou un serveur intermédiaire.
11. Ensuite, nous devons vérifier pourquoi l’état est reçu mais ne correspond pas à la valeur stockée.
12. Dans lib/WP_Auth0_LoginManager.php
, affichez les valeurs de l’état stocké et de l’état retourné et arrêtez le processus une fois terminé. Juste avant la ligne 148, ajoutez :
echo '<h1>$_REQUEST</h1>'; var_dump($_REQUEST); echo '<h1>$_COOKIE</h1>'; var_dump($_COOKIE); die('<h1>Done</h1>');
Was this helpful?
13. Encore une fois, assurez-vous d’être déconnecté et complétez la procédure de connexion.
14. Les valeurs doivent être affichées lorsque vous êtes redirigé vers l’URL de rappel de WordPress.
15. Vérifiez si la valeur state
dans $_REQUEST
existe et correspond à la valeur aauth0_state
dans $_COOKIE
.
Si cette valeur est différente, elle doit correspondre à la valeur d’origine enregistrée à l’étape 3 ci-dessus. Cela signifie que la valeur de l’état
$_COOKIE
a changé au cours du processus.
Si aucune des étapes ci-dessus ne résout le problème, veuillez rassembler les résultats des étapes ci-dessus et communiquer avec l’équipe de soutien ou publier un message sur Community avec le mot-clé wordpress
. Incluez également :
Version de PHP
Version de WordPress
Version du plugin Auth0
Navigateur et système d’exploitation utilisés pour le test
Un fichier HAR enregistre l’ensemble du processus, depuis le chargement de la page avec le formulaire de connexion jusqu’au message « État non valide » Pour en savoir plus sur les fichiers HAR, lisez Générer et analyser des fichiers HAR.
Billets associés
Erreur « État non valide » lors de la redirection Auth0 WordPress dans Auth0 Community
État non valide lorsque vous visitez l’URL de rappel directement sur wordpress.org