J'essaie donc de mettre en œuvre le scénario suivant:
app.com
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:
407 Proxy Authentication Required
et renvoie un Proxy-Authenticate
en-tête au format: "Proxy-Authenticate: Basic realm="proxy.com"
.Proxy-Authenticate
en-tête correctement défini?Proxy-Authorization
en-tête, c'est-à-dire la représentation Base64 du proxy username:password
.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?Proxy-Authorization
en-tête et un en-tête Authorization
évalué avec la représentation Base64 du username:password
.L'ensemble du flux de travail est-il correct?
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:
CONNECT
(toujours avec un Proxy-Authorization
header) pour ouvrir un tunnel TCP vers le serveur distant.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.