验证角色&使用Passport.js进行身份验证

时间:2014-11-12 19:44:07

标签: node.js express roles passport.js

因此,我想在API中创建一些路径,根据MongoDB中定义的用户角色显示不同的数据。这是我现在所拥有的一个样本,它有效...

router.get('/test', passport.authenticate('bearer', {session: false}), function (req, res) {
    if (req.user.role == "premium") {
        return res.send('you can see this content');
    }
    else {
        return res.send('you can not see this content');
    }
})

但是,最终目标是向用户提供至少某些内容,即使他们未使用正确的角色登录或进行身份验证。

router.get('/test', passport.authenticate('bearer', {session: false}), function (req, res) {
    if (req.user.role == "premium") {
        return res.send('this is premium content');
    }
    else {
        // could be hit by another role, or no user at all
        return res.send([some truncated version of the premium content]);
    }
})

我认为我会弄清楚如何工作,但我不知道如何在请求中没有任何授权标头的情况下指定可能被命中的相同路线。

这可以在Passport.js / Express中使用吗?

3 个答案:

答案 0 :(得分:9)

我建议您使用HTTP状态代码和错误对象,这是一种常见的API约定,它允许您的API用户知道发生了什么以及为什么:

app.get('/premium-resource', function(req, res, next) {
  passport.authenticate('bearer', function(err, user) {
    if (user){
      if (user.role === 'premium'){
        return res.send(200,{userContent:'you are a premium user'});
      }else{
        return res.send(403,{
          'status': 403,
          'code': 1, // custom code that makes sense for your application
          'message': 'You are not a premium user',
          'moreInfo': 'https://myawesomeapi.io/upgrade'
        });
      }
    }else{
      return res.send(401,{
        'status': 401,
        'code': 2, // custom code that makes sense for your application
        'message': 'You are not authenticated.',
        'moreInfo': 'https://myawesomeapi.io/docs'
      });
    }
  })(req, res, next);
});

免责声明:我在Stormpath工作,我们对API身份验证和设计进行了大量考虑,我们对该主题进行了真实的介绍:

https://stormpath.com/blog/designing-rest-json-apis/

答案 1 :(得分:7)

解决方案是限制视图中的内容而不是路径。

router.get('/test', authenticationMiddleware, function(req, res){
    var premiumFlag = req.user.role;
    res.send('premiumontent', {role: premiumFlag});
});

<强> premiumContent.jade

p This content is visible to all users

- if role === "premium"
    p this content is only visible to premium users

答案 2 :(得分:1)

我在回答中找到的解决方案是使用Passportjs.org文档的改编。

在我需要返回数据的路由中,无论用户是否登录,我都可以使用以下内容:

// Test to check for authentication
app.get('/login', function(req, res, next) {
  passport.authenticate('bearer', function(err, user, info) {
    if (user)
        // check user's role for premium or not
        if (user.role == "premium")
            return res.send('user is premium')
        else
            return res.send('user is not premium');
    else
        // return items even if no authentication is present, instead of 401 response
            return res.send('not logged in');
  })(req, res, next);
});