使用Passport.jsvalidationangular色和身份validation

所以我想在API中制作一些路由,根据MongoDB中定义的用户angular色显示不同的数据。 这是我现在所拥有的一个样本,它的工作原理

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'); } }) 

然而,最终目标是向用户呈现至less一些东西 ,即使他们没有以正确的angular色login或authentication。

 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吗?

我build议你使用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工作,我们在APIauthentication和devise方面有很多想法,我们在这个主题上有一个真实的介绍:

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

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

 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 

我find答案的解决scheme是使用Passportjs.org文档的改编。

在路线我需要返回数据,无论用户是否login,我可以使用类似于:

 // 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); });