2016-09-30 23 views
6

我目前有一個服務器在Tomcat servlet中使用Shiro令牌系統運行Spring,以檢查用戶是否已經登錄。它允許跨域請求。使用來自node.js的憑據進行反向代理登錄

在客戶端上我可以在任何其他域(一般使用角度)調用...

http.get('https://<my_check_login_service>', {withCredentials: true})

...只要我已經登錄(令牌未過期)返回用戶信息(名稱,頭像等)。

我還有一個系統,現在是一個節點服務器(也煮好的角度爲客戶端),爲此,我想打電話給節點服務器,並將它代理了上述my_check_login_service來獲取用戶,在session對象上設置信息(使用express),然後將用戶返回給客戶端。而且,通過會話對象,允許我信任它們的連接並允許它們根據從登錄服務返回的用戶的安全級別執行更多的api調用。

在Node.js的路由器,我可以代理這樣做......

app.get('/checklogin', function(req, res) { 
    req.pipe(request.get("https://<my_check_login_service>").pipe(res); 
} 

...但我不知道如何通過正確的憑據服務。如果我做...

http.get('checkLogin', {withCredentials: true})

...它,當然,不工作,因爲我login_service憑據不會被髮送到本地服務器。我怎樣才能通過正確的憑據來完成這項工作?

乾杯。

回答

2

憑證是最有可能在HTTP頭中,(都來自請求和響應)使所有報頭,與原始請求的地址,應使其工作:

app.get('/checklogin', function(req, res) { 
    console.dir(req.headers) 
    //You can inspect the headers here and pass only required values 
    const options = { 
    url: 'https://<my_check_login_service>', 
    headers: Object.assign(
     //Tell the login service about address of original request 
     {'X-Forwarded-For': req.connection.remoteAddress} 
     req.headers) 
    } 
    req.pipe(request.get(options)) 
    .on('response', (response) => res.set(response.headers)) 
    .pipe(res) 
} 

本示例通過傳遞原始地址設置X-Forwarded-Forlogin_service可能會識別它或不依賴於配置。

+0

是的!謝謝!我不完全確定它會起作用,因爲我現在意識到我可能需要一個通配符證書才能使它適用於我。但是,現在我得到了「錯誤:主機名/ IP與證書的altnames不匹配:」。我假設通配符證書將解決此問題。當我擺脫它時,會更新這個。 – crowmagnumb

+0

'login_service'也檢查客戶端IP地址,所以代理應該通過它。 我將其添加到答案 – DarkKnight

+0

可悲的是,這是行不通的。添加標頭至少讓服務器知道一些信息,但不會傳遞登錄所需的安全令牌。我認爲我想做的事情是不可能的,我只需要實施OAuth系統。如果在賞金到期之前我沒有其他答案,我肯定會給你。謝謝。 :) – crowmagnumb