2015-05-25 106 views
4

根據用戶登錄狀態,我想提供來自SAME api端點的不同結果。使用Passport.js部分保護API端點

該用例使用的文章來自相同的API端點。因此,一些文章意味着公開,而一些私人文章。 也有特殊頁面,可以查詢文章列表。

例: API /用品/特/所有

這個API目前應該全部歸還頁數在數據庫中。 但也應該過濾掉私人的結果,如果用戶沒有登錄

隨着Passport.js我只能保護整個API端點,例如:

router.get('/', auth.isAuthenticated(), controller.index); 

雖然我喜歡叫從實際函數內auth.isAuthenticated()方法,如:

// Get list of articles 
exports.index = function(req, res) { 
    Article.find(function (err, articles) { 
    if(err) { return handleError(res, err); } 
    var titles = []; 
    var loggedIn = false; 
    if (auth.isAuthenticated()) {loggedIn = true;} // NOT WORKING 
    for (var i = 0; i<articles.length; ++i) { 
     if (articles[i].role === 'loggedIn' && loggedIn) { 
      titles.push(articles[i].name); 
     } else if(articles[i].role !== 'loggedIn') { 
     titles.push(articles[i].name); 
     } 
    } 
    return res.json(200, titles); 
    }); 
}; 

任何想法,如何在控制器中使用Passport.js的,而不是保護整個API終點?

回答

0

我不確定如何使用passport.js來完成此操作,但是如果您使用的是類似Stormpath的東西,則很容易實現。

一旦你初始化/配置快遞-stormpath中間件,它會自動嘗試讓你明確地使用中間件認證的任何使用者沒有

因此,舉例來說,你可以說:

var express = require('express'); 
var stormpath = require('express-stormpath'); 

var app = express(); 

app.use(stormpath.init(app)); 

app.get('/myapi', function(req, res) { 
    if (req.user) { 
    res.json({ status: 'YOU ARE LOGGED IN: ' + req.user.email }); 
    } else { 
    res.json({ status: 'YOU ARE NOT LOGGED IN!' }); 
    } 
}); 

app.listen(3000); 

因爲Stormpath存儲您的用戶對你,如果你正在使用快遞,stormpath庫,這意味着它會嘗試無論是通過網絡來驗證用戶身份會話(在瀏覽器中)或用戶的API密鑰(Stormpath也可以存儲)。

這就是爲什麼它工作起來非常簡單,因爲中間件會檢查傳入的HTTP標頭並使用Basic Auth或OAuth2正確驗證用戶。=)