web-dev-qa-db-fra.com

Signalisation d'un échec d'authentification dans une API RESTful

J'écris une petite application qui expose une API HTTP REST-ish simple. Je suis coincé en essayant de décider comment signaler un échec en raison d'un manque d'autorisation.

L'application n'a pas d'API pour l'authentification, mais dépend à la place de la présence d'un cookie contenant un jeton de session obtenu par le client via un autre service. L'application vérifie la session et utilise l'identité obtenue via le processus de vérification pour effectuer une autorisation spécifique à l'application. Il n'y a aucun moyen pour un client de s'authentifier directement auprès de cette application.

Mon problème est que le code d'état HTTP évident pour rejeter les demandes non autorisées, "401 Unauthorized", est spécifié dans les termes de l'en-tête "WWW-Authenticate". Voir rfc2616 sec 10.4.2 .

La réponse DOIT inclure un champ d'en-tête WWW-Authenticate (section 14.47) contenant un défi applicable à la ressource demandée.

Je ne peux pas croire que ce soit un problème inhabituel. Est-il courant de simplement surcharger 401 pour inclure des utilisations plus générales? Qu'en est-il des navigateurs qui affichent des boîtes de dialogue d'authentification/e (ce que je n'ai d'ailleurs pas vu lors de mes tests, alors peut-être que cela ne se produit pas pour les POST)?

Bottom line: est-il acceptable d'utiliser 401 dans ce contexte, ou existe-t-il une meilleure solution?

38
j0ni

En règle générale, vous enverriez un 401 si le client peut authentifier et résoudre le problème, mais comme vous ne fournissez pas de moyen de vous authentifier dans l'API, je suggère de renvoyer une erreur 403 (interdite) à la place. Cela ne nécessitera pas l'en-tête et indiquera au client qu'il ne peut pas accéder au service.

37
tvanfosson

Renvoyez quelque chose comme ceci:

HTTP/1.1 401 Unauthorized
Location: https://example.com/auth-app/login
9
yfeldblum