Je travaille dans un petit cabinet de conseil et nous réalisons souvent des applications web pour nos clients. Le système d'authentification est une partie de l'application Web qui est souvent répétitive à écrire. Dans beaucoup de nos applications Web, nous aimerions prendre en charge la connexion OAuth des différents fournisseurs ainsi que l'enregistrement par courrier électronique.
Cependant, sa programmation dans chaque application Web prend du temps. Idéalement, ce que nous aimerions, c'est un serveur proxy d'authentification générique qui se trouve devant le serveur d'applications et gère tout ce qui concerne l'authentification (y compris la connexion, l'enregistrement et la déconnexion). Je me demande si quelque chose comme ça serait sécurisé? Ou s'il y a une raison liée à la sécurité pour laquelle cela ne devrait pas être fait comme ça?
J'imagine que cela ressemblerait à ceci:
Serveur d'authentification
SESSION
). Ces informations de session seraient la preuve que l'utilisateur s'est connecté correctement à un moment donné dans le passé. Si les informations de session sont correctes, il ajoute un X-UserId
en-tête de la demande et la transmet au serveur d'applications. S'il n'y a pas de cookie avec des informations d'authentification ou si les informations de session sont incorrectes, il transmet la demande au serveur d'applications sans le X-UserId
entête./login
, /logout
, et /register
). Il gérera ces demandes de lui-même. Le serveur d'applications ne sera même pas au courant de ces demandes.Serveur d'applications
X-UserId
en-tête du serveur Auth.Voici un exemple de fonctionnement de la connexion, ainsi que l'interaction entre le serveur Auth et le serveur d'applications:
Voici les étapes pour obtenir le login.html
page.
/login.html
.SESSION
. Il n'existe pas, il transmet donc la demande au serveur d'applications sans ajouter de X-UserId
entête./login.html
et il ne nécessite pas le X-UserId
l'en-tête existe, il renvoie donc le code HTML pour login.html
.Le login.html
la page pourrait contenir le code JS pour se connecter réellement. Voici une façon possible de le faire.
/login/email
pour vous connecter à l'aide d'une adresse e-mail et d'un mot de passe.HttpOnly
appelé SESSION
qui contient un JWT.Après cela, l'utilisateur pourrait être dirigé vers /home.html
. Les étapes à suivre sont similaires à /login.html
, sauf que l'utilisateur doit être authentifié:
/home.html
.SESSION
et décode le JWT. Le serveur Auth obtient l'ID utilisateur de la base de données en fonction des informations contenues dans le JWT. Disons que l'ID utilisateur est 5.X-UserId=5
en-tête de la demande et la transmet au serveur d'applications. (Dans le cas où le cookie SESSION
n'existe pas ou si le JWT ne peut pas être décodé avec succès, le serveur Auth transmet la demande au serveur d'applications sans ajouter de X-UserId
entête. Les étapes suivantes sont écrites en supposant que l'authentification réussit et que le serveur d'authentification ajoute l'en-tête `X-UserId.)/home.html
, le serveur d'applications sait qu'un ID utilisateur valide est requis, il vérifie donc le X-UserId
entête.X-UserId
en-tête et l'utilise pour extraire des données de la base de données d'application et créer le home.html
page.home.html
page vers le serveur Auth.Voici quelques informations supplémentaires qui ne cadraient pas vraiment ci-dessus:
X-UserId
en-tête s'il est envoyé par un utilisateur avant de transmettre la demande au serveur d'applications.Une configuration comme celle-ci est-elle sécurisée?
Les procurations inversées sont assez courantes pour ce que vous demandez. Un certain nombre d'entreprises fabriquent des serveurs conçus pour répondre à vos demandes afin que vous puissiez les utiliser comme référence.
Par exemple, j'ai beaucoup utilisé WebSeal (IBM ISAM) dans l'entreprise (semble populaire pour une raison quelconque autour de moi). Ils ont déjà des modules pour OAuth et la plupart des autres types d'authentification.
Vous pouvez utiliser ces serveurs pour:
Notes de conception:
Lorsque vous essayez d'autoriser une demande, regardez OAuth 2.0 ou JWT.
Utilisez un jeton d'identification pour l'identité (par exemple, spécification OpenID, ou si vous jetez votre propre regard sur les JWT)
Demandez aux applications Web d'utiliser un jeton d'autorisation pour obtenir un jeton d'accès.
Utilisez des jetons d'accès pour fournir des ressources protégées.
Ceci est une excellente configuration.
Consultez la documentation de Google au-delà de Corp pour en savoir plus sur la façon dont ils pensent les réseaux et ce type d'accès.
https://cloud.google.com/beyondcorp/
Si vous voulez rouler le vôtre, vous pouvez utiliser quelque chose comme une passerelle réseau duo. Mais le problème avec les proxy inverses est que vous devez pointer tous les DNS vers la même IP du proxy inverse et configurer manuellement chaque ressource.
Une autre approche est une combinaison de fichiers PAC et d'un proxy direct qui nécessite une authentification. Vous pouvez ensuite spécifier que N'IMPORTE QUELLE URL doit être envoyée via le proxy direct, le proxy direct effectue l'authentification et transmet le trafic à la ressource où qu'elle se trouve. La ressource peut être configurée pour autoriser uniquement l'adresse IP source.