使用Passport.js部分保护API端点

时间:2015-05-25 22:52:25

标签: node.js authentication passport.js

根据用户登录状态,我想从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端点?

1 个答案:

答案 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正确验证用户=)