2012-04-24 9 views
8

私は、JavaScriptアプリケーションの開発に使用している単純なExpressベースのNode.js Webサーバーを使用しています。私は、アプリケーションが別のドメインとポート上で動作しているJettyサーバーに対して行う、proxy-API要求にnode-http-proxyを使うようにサーバーを設定します。このセットアップは、セッション管理に関する問題に遭遇するまで完璧に動作しています。node-http-proxy経由のクッキーベースのセッションを維持する

認証時に、アプリケーションサーバーは、サーバーセッションを表す認証トークンを含むCookieを返します。 JSアプリケーションをファイルシステム(file://)から実行すると、クライアントがクッキーを受け取ると、後続のすべてのAPIリクエストで送信されることがわかります。ノードサーバー上でJSアプリケーションを実行し、API呼び出しがnode-http-proxy(RoutingProxy)を介してプロキシされると、要求ヘッダーにはCookieが含まれません。

このタイプのセッション永続性をプロキシ経由でサポートするために手動で処理する必要があるものはありますか?私はnode-http-proxyコードを掘り下げてきましたが、Nodeが初めてのので少し頭がおかしくなります。

https://gist.github.com/2475547か:

var express = require('express'), 
    routingProxy = require('http-proxy').RoutingProxy(), 
    app = express.createServer(); 

var apiVersion = 1.0, 
    apiHost = my.host.com, 
    apiPort = 8080; 

function apiProxy(pattern, host, port) { 
    return function(req, res, next) { 
     if (req.url.match(pattern)) { 
      routingProxy.proxyRequest(req, res, {host: host, port: port}); 
     } else { 
      next(); 
     } 
    } 
} 

app.configure(function() { 
    // API proxy middleware 
    app.use(apiProxy(new RegExp('\/' + apiVersion + '\/.*'), apiHost, apiPort)); 

    // Static content middleware 
    app.use(express.methodOverride()); 
    app.use(express.bodyParser()); 
    app.use(express.static(__dirname)); 
    app.use(express.errorHandler({ 
     dumpExceptions: true, 
     showStack: true 
    })); 
    app.use(app.router); 
}); 

app.listen(3000); 

答えて

5

私はあなたが手動で応答を見て、それがセットクッキーかどうかを見て、JSESSSIONIDを切り捨てて変数に格納し、後続のすべての要求にヘッダーとして渡して尋ねました。このように、リバースプロキシはクッキーとして機能します。

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

理想的には、プロキシの仕事は、単に先に要求を転送するために、クッキーなどの重要なヘッダを取り除くべきではないですが、それであれば、私はあなたが提出すべきだと思いますそれらに対する問題https://github.com/nodejitsu/node-http-proxy/issues

また、要求ヘッダーにはクッキーが含まれていないと言われました。クライアントが受信したことはありませんか?

+0

Web Inspectorで、クライアントが「set-cookie」ヘッダーを受け取っていることを確認しました。あなたはトランザクション[ここ](http://i.imgur.com/VQV0a.png)を見ることができます。この場合のリクエストCookieは、私がセッションをサポートするために使用しようとしていたExpressのcookieParserによって生成されていますが、それは常に独自のことをするようです。 – tomswift

+0

GitHubで、プロキシされたサーバーの応答からCookieを取得し、セッションを手動でサポートするのに苦労しました。https://github.com/nodejitsu/node-http-proxy/issues/236 – tomswift

0

node-http-proxyをフォークして変更することでこれを実装する方法が見つかりました。私の現在の目的は開発環境です。どんな種類の真剣な検討のためにも、より合法的な解決策に結集する必要があります。

は、私がGitHubの中で提出された問題で見つけることができます:https://github.com/nodejitsu/node-http-proxy/issues/236#issuecomment-5334457

私は私が間違った方向に完全つもり場合は特に、このソリューションには、いくつかの入力を大好きです。

0

こんにちは@tomswiftがローカルhttpプロトコル上のサーバー実行されますが、セッションクッキーは次のようにSecure;でリモートサーバキャリーから受信ん。その場合に、ローカルサーバの応答の前に、

'set-cookie': 
[ 'JSESSIONID=COOKIEWITHSECURE98123; Path=/;HttpOnly;Secure;'] 

クライアントの場合、元の応答(リモートサーバーからローカルサーバーへの応答)のset-cookieを抽出し、Secure;を削除し、残りの部分をプロキシ応答(ローカルサーバーからクライアントへの応答)ヘッダーに入れます。

'set-cookie': 
[ 'JSESSIONID=COOKIEWITHSECURE98123; Path=/;HttpOnly;'] 

クライアントは自動的にセッションCookieを取得します。

希望します。

関連する問題