web-dev-qa-db-fra.com

Quel code d'état HTTP est censé être utilisé pour indiquer au client que la session a expiré?

Dans une page Web, il utilise le gestionnaire de connexions/la source de données YUI pour envoyer des requêtes AJAX au serveur. Les utilisateurs authentifiés doivent renvoyer un code d’état http indiquant au client que la session a déjà expiré. Le client le redirige simplement vers la page de connexion ou lui demande s’il souhaite étendre la session.

Ma question est que, dans cette situation, quel code de statut http est le plus approprié pour indiquer au client que la session a expiré?

Liste des codes de statut HTTP du wiki

66
bobo

Le meilleur que je puisse suggérer est un code de statut HTTP 401 avec un en-tête WWW-Authenticate.

Le problème avec les requêtes 403 est la RFC 2616 states "L'autorisation ne vous aidera pas et la requête NE DEVRAIT PAS être répétée." (c’est-à-dire peu importe que vous soyez authentifié ou non, vous n’allez jamais avoir accès à cette ressource).

Le problème avec les requêtes 401 est qu’il indique qu'elles "DOIVENT inclure un champ d’en-tête WWW-Authenticate". Comme quelqu'un l'a noté il ne semble pas que le fait d'utiliser une valeur personnalisée dans un en-tête WWW-Authenticate constitue une violation de la spécification.

Je ne vois aucune raison dans RFC 2617 pourquoi un statut HTTP 401 combiné à un en-tête WWW-Authenticate personnalisé comme celui-ci ne conviendrait pas:

WWW-Authenticate: MyAuthScheme realm="http://example.com"

Le oAuth spec semble en fait faire exactement cela, car ils le recommandent (bien qu'ils aient à mon sens une interprétation étrange de la RFC):

WWW-Authenticate: OAuth realm="http://server.example.com/"

Cela ne semble pas être spécifiquement SANCTIONNÉ par la RFC, mais je ne peux pas réellement voir que c'est interdit par elle (cela ne semble pas entrer en conflit avec aucune condition DOIT ou NE DOIT PAS, NE DOIT OU NE DOIT PAS).

J'aimerais qu'il y ait un code de statut HTTP plus spécifique pour les délais d'expiration et pour des éléments tels que les jetons CSRF non valides, ce qui était plus clair.

58
Iain Collins

Je recommanderais un HTTP 401.

Tandis qu'un 403 dit en gros: "Vous n'êtes pas autorisé, partez et ne revenez pas", un 401 dit: "Nous ne savons pas si vous êtes autorisé ou non parce que vous n'avez pas apporté votre carte d'identité. Allez récupérez-le et essayez à nouveau. "

Comparer Définitions de Wikipedia :

HTTP 403 - La demande était une demande légale, mais le serveur refuse d'y répondre.

HTTP 401 - Identique à 403 interdit, mais spécifiquement utilisé lorsque l'authentification est possible mais a échoué ou n'a pas encore été fournie.

28
Jonathon Hill

Qu'en est-il de 419 - ce n'est pas standard, mais la description sur Wikipedia semble correspondre:

419 Délai d'expiration de l'authentification 

419 Délai d’authentification ne correspond pas à la norme HTTP cette authentification précédemment valide a expiré. Il est utilisé comme un alternative à 401 Non autorisé afin de se différencier de sinon, l'accès à un serveur spécifique est refusé aux clients authentifiés Ressources.

17
John Reichert

Je crois que le code approprié va être 403/Forbidden. Il n'y en a pas qui soient directement liés aux sessions.

13
Jason

La vérité est qu'il n'y a pas de code d'état HTTP standard pour un délai d'attente de session. Les sessions sont implémentées dans la couche application, pas dans la couche de transport HTTP.

Il existe un code d'état personnalisé utilisé par Microsoft pour le délai d'expiration de session: 599, ou créez simplement votre propre code d'état dans la plage 5xx.

Depuis le wiki des codes d'état:

599 Erreur de délai de connexion au réseau (Inconnue) Ce code de statut n'est spécifié dans aucun RFC, mais est utilisé par les mandataires HTTP de Microsoft Corp. pour signaler un délai de connexion réseau derrière le proxy à un client situé devant le proxy.

J'utilise le code d'état personnalisé 599 pour un délai de session, puis je le vérifie dans la réponse AJAX.

10
Dermot Doherty

Selon le lien Wikipedia de Codes de statut Http fourni ci-dessus par Bobo:

440 Login Timeout (Microsoft)

    A Microsoft extension. Indicates that your session has expired.
8
Faisal Mq

Lorsque vous publiez un lien, j'ai trouvé dans ce lien ce code d'état HTTP 440 . vous pouvez utiliser le code d'état 440 HTTP pour une session expirée.

440 Login Time-out

 The client's session has expired and must log in again.

401 Non autorisé, nous pouvons utiliser quand, les informations d'identification de connexion de l'utilisateur sont erronées. ou le jeton d'authentification transmis dans l'en-tête n'est pas valide.

403 Interdit, nous pouvons l'utiliser lorsque l'utilisateur ne dispose pas d'une autorisation spécifique pour la ressource demandée.

Donc, à mon avis, nous devrions utiliser 440 Login Time-out .

3
Vinay Pandya

Techniquement, la réponse acceptée est la réponse correcte: si vous savez déjà avec certitude que vous allez échouer à la demande et que vous demandez quel code d’erreur renvoyer, alors HTTP 401 "Unauthorized (Unauthenticated)" est le bon choix, quant à l'invite de re-authentification. 

Mais tout d’abord, demandez-vous: si vous échouez à la demande?

Considérez que l'utilisateur peut simplement visiter une page publique de votre site Web. Dans ce cas, vous allez les gifler au visage avec un message "Non autorisé!". message, et leur demandant de s'authentifier à nouveau, afin de voir une page qu'ils seraient normalement en mesure de voir sans authentification. C'est pas cool.

Mon conseil est d'ignorer le fait que le jeton de session est inconnu et de simplement générer un nouveau jeton de session et créer une nouvelle session pour celui-ci. Bien entendu, l'état initial de la session sera "pas encore authentifié". Par conséquent, si l'utilisateur tente d'accéder à une page non publique, la page veillera à ce qu'il reçoive un HTTP 401 "Unauthorized (Non authentifié) "et doit s'authentifier. Mais si l'utilisateur atterrit sur une page publique, il ne remarquera rien de différent.

0
Mike Nakis

J'utiliserais une réponse de redirection 302, avec un en-tête "Location" dirigeant vers un chemin de ressource du type "/ auth-required"

Le client peut acheminer le chemin d'accès aux ressources à un modal à l'aide d'un formulaire de connexion/mot de passe, en évitant de transférer l'utilisateur vers une autre page.

0
pinei