2016-03-01 43 views
0

我有一個Web應用程序和一個RESTful API來與數據庫進行通信。 Web應用程序的前端使用Angular HTTP發佈/獲取/放入後端,後者依次處理身份驗證,發佈/獲取/放入api並返回結果。後端通過JWT將自己認證爲API的管理員,但使用基於cookie的會話對用戶進行身份驗證。所以,API是無狀態的,但Web服務器使用狀態。Node.js中的RESTful API - 通過授權進行篩選

我一直在尋找一些選項,以使用授權機制來過濾基於用戶的查詢結果。例如,我有一個問題終端,我返回只由登錄用戶的公司創建的問題列表。

1 - 我一直在做的Web服務器上(基本上過濾):

router.get('/questions', passportConf.isAuthenticated, function(req, res) { 
    restler.get(process.env.API_URL + '/questions/?organisation=' + req.user.organisation._id).on('complete', function(questions) { 
     res.json({ 
     data: questions 
     }); 
    }); 
}); 

2-然而,另一種選擇是將問題用戶組織端點下終結點嵌套,如:

/user/organisation/questions 

3-或者基本上我可以把用戶放在對API的請求中,這個請求會根據請求主體上的用戶組織進行過濾。最後,我可以跳過Web服務器上基於cookie的會話身份驗證,直接從前端向API發送請求,並使用JWT驗證用戶身份(這與第一點中的問題過濾方式相同)。

我是相當新的Node.js的,我想知道如果有一個模塊或一種常見的做法,以處理1或4

+0

我認爲restler是路由器?或者是nodejs應用程序的名稱? – sarker306

+0

@ sarker306它是一個HTTP客戶端庫。 https://github.com/danwrong/restler該塊位於路由器本身中,將組織信息添加到對API所做的請求中。 –

回答

-1

特別過濾請注意,這僅僅是從誰擁有用戶的響應試圖遵循模式實踐。

我一直在使用Express框架。使用express,你可以很容易地處理http請求,這是使用Nodejs進行web開發的最流行的框架之一。

爲了解決授權問題,我會添加一箇中間件(可以是一個函數),它將使過濾成爲可能。例如,如果router是將處理所有的請求和發送回覆路由器的名字,我會添加以下代碼在router.js,所有的路由器的特定邏輯將被保存的文件:

router.use(function isAuthorized(req, res, next){ 
    // Add your filtering code here 
}); 

在這情況下,這將是,

router.use(passportConf.isAuthenticated); 

使用此一次,並在你的路由器每一擊將不得不通過這個中間件。

現在,我們正試圖將 'GET' 要求:

var http = require('http'); //basic node.js module, needed for handling http requests 

router.get('/questions', function(req, res) { 
    var url = process.env.API_URL; 
    var opt = {host: url, path : '/questions/?organisation=' + req.user.organisation._id} 
    http.request(opt, function(questions){ 
     res.json({data: questions}); 
    }).end(); 
}); 
+0

這不能遠程回答我的問題,並且API_URL以http://api.ABC.com開頭。基本上它是我的網絡中的一些其他虛擬機,我看不出如何添加斜線會使我的生活更輕鬆。 –

+0

基本上我試圖證明你不需要使用另一個模塊來處理http請求,如果你使用的是Express。重新加載以獲取更新的響應。 – sarker306

+0

我不是「處理」一個HTTP請求,而是向我的API服務器「發出」一個HTTP請求。 –