web-dev-qa-db-fra.com

Spécification HTTP: en-têtes d'autorisation proxy et d'autorisation

J'essaie donc de mettre en œuvre le scénario suivant:

  • Une application est protégée par l'authentification de base. Disons qu'il est hébergé sur app.com
  • Un proxy HTTP, devant l'application, nécessite également une authentification. Il est hébergé sur proxy.com

L'utilisateur doit donc fournir des informations d'identification pour le proxy et l'application dans la même demande, il a donc différentes paires nom d'utilisateur/mot de passe: une paire pour s'authentifier auprès de l'application et une autre paire nom d'utilisateur/mot de passe pour s'authentifier auprès du proxy.

Après avoir lu les spécifications, je ne suis pas vraiment sûr de la façon dont je devrais implémenter cela. Ce que je pensais faire, c'est:

  1. L'utilisateur fait une requête HTTP au proxy sans aucune sorte d'authentification.
  2. Le proxy répond 407 Proxy Authentication Required et renvoie un Proxy-Authenticate en-tête au format: "Proxy-Authenticate: Basic realm="proxy.com".
    Question: Est-ce Proxy-Authenticate en-tête correctement défini?
  3. Le client réessaye ensuite la demande avec un Proxy-Authorization en-tête, c'est-à-dire la représentation Base64 du proxy username:password.
  4. Cette fois, le proxy authentifie la demande, mais l'application répond ensuite par un 401 Unauthorized entête. L'utilisateur a été authentifié par le proxy, mais pas par l'application. L'application ajoute un WWW-Authenticate en-tête de la réponse comme WWW-Authenticate: Basic realm="app.com". Question: cette valeur d'en-tête est correcte non?
  5. Le client réessaye la demande avec à la fois un Proxy-Authorization en-tête et un en-tête Authorization évalué avec la représentation Base64 du username:password.
  6. À ce stade, le proxy authentifie avec succès la demande, la transmet à l'application qui authentifie également l'utilisateur. Et le client obtient enfin une réponse.

L'ensemble du flux de travail est-il correct?

42
Mark

Oui, cela ressemble à un flux de travail valide pour la situation que vous avez décrite, et ces en-têtes Authenticate semblent être au format correct.

Il est intéressant de noter qu'il est possible, bien que peu probable, qu'une connexion donnée implique plusieurs proxys chaînés, et chacun peut lui-même nécessiter une authentification. Dans ce cas, le côté client de chaque proxy intermédiaire récupérerait lui-même un 407 Proxy Authentication Required message et répète lui-même la demande avec le Proxy-Authorization entête; le Proxy-Authenticate et Proxy-Authorization les en-têtes sont des en-têtes à saut unique qui ne sont pas transmis d'un serveur à l'autre, mais WWW-Authenticate et Authorization sont des en-têtes de bout en bout qui sont considérés comme provenant du client vers le serveur final, transmis textuellement par les intermédiaires.

Étant donné que le schéma Basic envoie le mot de passe en clair (base64 est un encodage réversible), il est le plus souvent utilisé sur SSL. Ce scénario est implémenté d'une manière différente, car il est souhaitable d'empêcher le proxy de voir le mot de passe envoyé au serveur final:

  • le client ouvre un canal SSL au proxy pour lancer la demande, mais au lieu de soumettre une demande HTTP régulière, il soumettra ne demande spéciale CONNECT (toujours avec un Proxy-Authorization header) pour ouvrir un tunnel TCP vers le serveur distant.
  • Le client procède ensuite à la création d'un autre canal SSL imbriqué à l'intérieur du premier, sur lequel il transfère le message HTTP final comprenant l'en-tête Authorization.

Dans ce scénario, le proxy ne connaît que l'hôte et le port auquel le client est connecté, pas ce qui a été transmis ou reçu sur le canal SSL interne. En outre, l'utilisation de canaux imbriqués permet au client de "voir" les certificats SSL du proxy et du serveur, permettant ainsi d'authentifier l'identité des deux.

28
Martin Atkins