104 votes

HTTP 401 - quelle est la valeur appropriée de l'en-tête WWW-Authenticate ?

L'application sur laquelle je travaille en ce moment a une valeur de délai d'attente pour la session. Si l'utilisateur n'a pas interagi pendant plus longtemps que cette valeur, la prochaine page qu'il essaiera de charger lui demandera de se connecter.

Toutes les demandes effectuées sont acheminées par ce mécanisme, qui inclut les appels AJAX. A l'origine, nous envoyions un en-tête 200 avec la page de connexion, ce qui introduit quelques problèmes avec AJAX puisque du code est exécuté si une réponse 200 est envoyée, et la plupart des données renvoyées par ces appels RPC sont du JSON ou du JavaScript brut qui est évalué (ne demandez pas :|).

J'ai suggéré qu'une 401 est meilleure, puisque notre analyseur JSON n'essaiera pas de consommer une page de connexion HTML :)

Quand lecture de la spécification Cependant, j'ai remarqué que le WWW-Authenticate doit également être envoyé.

Quelle est une bonne valeur pour ce champ ? Will Application Login suffisent ?

66voto

Swanny Points 1217

En indiquant l'authentification HTTP de base, nous retournons quelque chose comme :

WWW-Authenticate: Basic realm="myRealm"

Considérant que Basic est le schéma et le reste dépend beaucoup de ce schéma. Dans ce cas, realm fournit simplement au navigateur un littéral qui peut être affiché à l'utilisateur lorsqu'il est invité à saisir son identifiant et son mot de passe.

Il est évident que vous n'utilisez pas l'authentification de base, car il est inutile d'avoir une expiration de session lorsque l'authentification de base est utilisée. Je suppose que vous utilisez une forme d'authentification basée sur les formulaires.

Si je me souviens bien, Windows Challenge Response utilise un schéma différent et des arguments différents.

Le problème est que c'est au navigateur de déterminer les schémas qu'il prend en charge et la manière dont il y répond.

Si vous utilisez l'authentification basée sur des formulaires, je pense qu'il faut conserver la page 200 + relogin mais ajouter un en-tête personnalisé que le navigateur ignorera mais que votre AJAX pourra identifier.

Pour une très bonne expérience utilisateur + AJAX, faites en sorte que le script s'accroche à la demande AJAX qui a trouvé la session expirée, lance une demande de reconnexion via une popup, et en cas de succès, soumet à nouveau la demande AJAX originale et continue comme d'habitude.

Évitez la tricherie qui consiste à faire en sorte que le script frappe le site toutes les 5 minutes pour maintenir la session en vie, car cela va à l'encontre du but de l'expiration de la session.

L'autre solution consiste à brûler la requête AJAX, mais l'expérience de l'utilisateur s'en trouve réduite.

7voto

Pär Wieslander Points 11258

Non, vous devez spécifier la méthode d'authentification à utiliser (généralement "Basic") et le domaine d'authentification. Voir http://en.wikipedia.org/wiki/Basic%5Faccess%5Fauthentication pour un exemple de demande et de réponse.

Vous pouvez également lire RFC 2617 - Authentification HTTP : Authentification d'accès Basic et Digest .

0voto

Corbella Points 558

Il suffit d'ajouter l'en-tête à :

WWW-Authenticate: None

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X