2015-05-25 68 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正确验证用户。=)