web-dev-qa-db-fra.com

401 Unauthorized vs 403 Forbidden: Quel est le bon code d'état lorsque l'utilisateur ne s'est pas connecté?

Après beaucoup de recherches sur Google et Stackoverflowing, cela n’est toujours pas clair pour moi, car de nombreux articles et questions/réponses étaient trop généraux (y compris 403 Forbidden vs 401 réponses HTTP non autorisées qui ne correspondait pas spécifiquement à mon cas d’utilisation).

Question: Quel est le code de statut HTTP approprié lorsque l'utilisateur ne s'est pas connecté et demande à voir certaines pages qui devraient être affichées uniquement pour les utilisateurs connectés?

4
Mohammad Naji

La réponse satisfaisante que j'ai trouvée une fois pour toutes est la suivante:

Réponse courte:

401 non autorisé


La description:

Bien que nous sachions d’abord authentication (l’utilisateur connecté ou pas?), Nous passerons ensuite à authorisation (at-il le nécessaire privilège ou pas?), mais voici la clé qui nous fait nous tromper:

Mais «401 Unauthorized» n’est-il pas une autorisation, pas une authentification?

À l'époque de la spécification HTTP (RFC 2616), les deux mots ne peuvent pas ont été aussi largement compris comme étant distincts. C’est clair dans le description et autres textes explicatifs qui concernent 401 authentification.

De Codes de statut HTTP 401 non autorisé et 403 interdit pour authentification et autorisation (et OAuth) .

Alors peut-être, si nous voulons réécrire les normes! en nous concentrant suffisamment sur chaque mot, nous pouvons nous reporter au tableau suivant:

Status Code | Old foggy naming | New clear naming | Use case
+++++++++++ | ++++++++++++++++ | ++++++++++++++++ | ++++++++++++++++++++++++++++++++++
401         | Unauthorized     | Unauthenticated  | User has not logged-in
403         | Forbidden        | Unauthorized     | User doesn't have enough privilege
7
Mohammad Naji

Cela dépend du mécanisme que vous utilisez pour effectuer la connexion.

La spécification pour 403 Forbidden dit:

Le code d'état 403 (Interdit) indique que le serveur compris la demande mais refuse de l’autoriser. Un serveur qui souhaite rendre public la raison pour laquelle la demande a été interdite peut décrivez cette raison dans la charge utile de la réponse (le cas échéant).

Si des informations d'authentification ont été fournies dans la demande, le serveur les considère insuffisantes pour accorder l'accès. Le client NE DEVRAIT PAS répéter automatiquement la demande avec le même lettres de créance. Le client PEUT répéter la demande avec un nouveau ou différent lettres de créance. Cependant, une demande peut être interdite pour des raisons sans rapport avec les informations d'identification.

Bien que 401 non autorisé ne soit pas défini dans les principaux codes de statut HTTP, mais se trouve dans spécification d'authentification HTTP et indique:

Le code d'état 401 (non autorisé) indique que la demande n'a pas été appliqué car il manque des informations d'authentification valides pour la ressource cible. Le serveur générant une réponse 401 DOIT envoyer un champ d'en-tête WWW-Authenticate (Section 4.1) contenant au moins un défi applicable à la ressource cible.


Ainsi, si vous utilisez les en-têtes WWW-Authenticate et Authorization comme mécanisme d'authentification, utilisez 401. Si vous utilisez une autre méthode, utilisez 403.

2
Quentin

IMO Cela dépend du type de ressource que vous essayez d'interroger. Cela semble plus logique de cette façon. Interdit fait plus référence aux fichiers ou aux dossiers d'un site Web, ou aux ressources en général, tandis qu'Unauthorized est plus logique à utiliser si un type d'exécution est requis, des scripts de page, etc.

0
Merak Marey