11
votes

Persistant une session basée sur les cookies sur le nœud-http-proxy

J'ai un simple serveur Web Express basé sur le site Web que j'utilise pour le développement d'une application JavaScript. J'ai configuré le serveur pour utiliser le nœud-http-proxy sur les demandes d'API proxy L'application permet à un serveur de jetty qui s'exécute sur un autre domaine et un autre port. Cette configuration fonctionne parfaitement jusqu'à ce que je commence à rencontrer des problèmes avec la gestion de la session.

Lors de l'authentification, le serveur d'applications renvoie un cookie avec un jeton authentifiant représentant la session de serveur. Lorsque j'exécute l'application JS de mon système de fichiers (fichier: //), je peux voir qu'une fois le client reçoit le cookie, il est envoyé dans toutes les demandes d'API ultérieures. Lorsque j'exécute l'application JS sur le serveur de nœud et les appels d'API sont proxé via Node-http-proxy (routingproxy) les en-têtes de demande n'incluent jamais le cookie.

y a-t-il besoin de gérer manuellement pour soutenir cette Type de session Persistance à travers le proxy? J'ai traversé le code proxy de nœud http-proxy, mais c'est un peu sur ma tête parce que je suis nouveau à noeud.

https://gist.github.com/2475547 ou: xxx


0 commentaires

5 Réponses :


0
votes

Idéalement, le poste d'un proxy consiste à transmettre une demande à la destination et ne doit pas dépouiller les en-têtes critiques comme les cookies, mais si c'est le cas, je pense que vous devriez déposer une question contre eux ici https://github.com/nodejitsu/node-http-proxy/issues .

Aussi vous avez dit que les en-têtes de la demande n'incluent jamais le cookie, est-il possible que le client ne l'a jamais reçu?


2 commentaires

J'ai confirmé dans l'inspecteur Web que le client reçoit l'en-tête «Set-Cookie». Vous pouvez voir la transaction ici . Le cookie de la demande dans ce cas est généré par EXPRESS CookieParser que j'essayais d'utiliser pour soutenir la session, mais il semble toujours faire sa propre chose.


A ouvert un problème dans GitHub alors que je lutte pour essayer de recevoir le cookie de la réponse du serveur proxé et de soutenir manuellement la session: github.com/nodejitsu/node-http-proxy/issues/236



0
votes

J'ai trouvé un moyen de le mettre en œuvre en modifiant et en modifiant le nœud-http-proxy. Il sert mon objectif actuel qui est un environnement de développement. Pour toute sorte de considération sérieuse, il doit être formé dans une solution plus légitime.

Les détails peuvent être trouvés dans le numéro que j'ai déposé dans github: https://github.com/nodejitsu/node-http-proxy/issues/236#issuecomment-5334457

J'aimerais avoir une entrée sur cette solution, surtout si je vais complètement dans la mauvaise direction.


0 commentaires

5
votes

J'ai fait ce que vous demandez par regarder manuellement la réponse, voyant s'il s'agit d'un cookie Ensemble, sortez de la Jsesssionid, en train de le stocker dans une variable et de la transmettre à toutes les demandes suivantes en tête de tête. De cette façon, le proxy inverse agit comme un cookie.

on('proxyReq', function(proxyReq){ proxyReq.setHeader('cookie', 'sessionid=' + cookieSnippedValue) 


0 commentaires

2
votes

HI @Tomswift effectue votre serveur local sur le protocole HTTP, mais le cookie de session reçoit du serveur distant portant avec sécurisé; comme: xxx

si oui. , avant votre réponse du serveur local sur le client, extraire set-cookie à partir de la réponse d'origine (réponse de Server distant à Server local) en-tête, supprimez le Secure; et mettez le reposez-vous dans la réponse proxy (réponse du serveur local au client) en-tête comme: xxx

puis le client prendra le cookie de session automatiquement.

J'espère que cela peut aider.


2 commentaires

Merci d'avoir mentionné ce @halt supprimer le drapeau sécurisé a également résolu mon problème spécifiquement lié à jsessieid


Soyez prudent lorsque vous retirez le drapeau «sécurisé». Cela signifie que les cookies seront envoyés sur des connexions non sécurisées et pourraient être exposées à des renifleurs de paquets, ce qui permettrait de donner des informations de connexion de l'utilisateur, ou des informations de session sensibles!



0
votes

J'ai eu des problèmes similaires que les cookies n'ont pas été transmis au client. Solution:

  1. Obtenez Cookie de la réponse proxy li>
  2. Définissez-le dans la demande de proxy, avec une valeur légèrement modifiée LI> OL>
    let cookie;
    const webpackConfig = {
      proxy: {
        '/api': {
            ...
            onProxyReq: (proxyReq) => {
              if(cookie) {
                proxyReq.setHeader('Cookie', cookie);
              }
            },
            onProxyRes: (proxyRes) => {
              const sc = proxyRes.headers['set-cookie'];
    
              const raw = sc.filter(s => s.startsWith('JSESSIONID'));
    
              if(raw.length) {
                cookie = raw[0].split(';')[0];
              }
            }
    
        }
      }
    }
    


0 commentaires