根据用户登录状态,我想从SAME 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 :(得分:0)
我不确定如何使用passport.js完成此操作,但如果您使用Stormpath之类的内容,则可以轻松完成开箱即用。
初始化/配置express-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会为您存储您的用户,如果您正在使用express-stormpath库,这意味着它将尝试通过Web会话(在浏览器中)或用户的API密钥(Stormpath也是如此)对用户进行身份验证存储)。
这就是为什么它的工作非常简单,因为中间件会检查传入的HTTP头并使用Basic Auth或OAuth2正确验证用户=)