web-dev-qa-db-fra.com

HTTP 401 - Qu'est-ce qu'une valeur d'en-tête WWW-Authenticate appropriée?

L'application sur laquelle je travaille en ce moment a une valeur de délai d'expiration de session. Si l'utilisateur n'a pas interagi depuis plus longtemps que cette valeur, il sera invité à se connecter lors de la prochaine page à charger.

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

J'ai suggéré qu'un 401 est préférable, car notre analyseur JSON n'essaiera pas de consommer une page de connexion HTML .. :)

Cependant, lorsque lisant la spécification , j’ai remarqué que le champ WWW-Authenticate devait également être envoyé.

Qu'est-ce qu'une bonne valeur pour ce domaine? Est-ce que Application Login Suffira?

102
Will Morgan

Lorsque nous indiquons l'authentification de base HTTP, nous renvoyons quelque chose comme:

WWW-Authenticate: Basic realm="myRealm"

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

De toute évidence, vous n'utilisez pas de base, puisqu'il est inutile d'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.

De mémoire, Windows Challenge Response utilise un schéma différent et des arguments différents.

Le truc, c'est que c'est au navigateur de déterminer les schémas qu'il prend en charge et comment il y répond.

Mon instinct, si vous utilisez une authentification basée sur des formulaires, reste avec la page de reloginage 200+ mais ajoute un en-tête personnalisé que le navigateur ignorera mais que votre AJAX peut identifier.

Pour une très bonne expérience utilisateur + AJAX, demandez au script de s’accrocher à la demande AJAX qui a trouvé la session expirée, déclenchez une demande de reconnexion via un popup, et en cas de succès, soumettez à nouveau la demande originale AJAX) et poursuivez normalement.

Évitez les tricheurs qui obligent le script à accéder au site toutes les 5 minutes pour maintenir la session en vie, car ils annulent le point d'expiration de la session.

L'autre alternative est de graver la demande AJAX mais l'expérience utilisateur est médiocre.

64
Swanny

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

Vous voudrez peut-être aussi lire RFC 2617 - Authentification HTTP: Authentification d’accès de base et Digest .

6
Pär Wieslander