【发布时间】:2014-11-06 12:25:37
【问题描述】:
是否有来自 Passport.js 的可选身份验证中间件?
假设我有一条路线,/api/users。我只想向公众提供一个用户列表,但对于经过身份验证的人,我想添加更多字段。
目前我只有一个愚蠢的自定义方法可以做同样的事情,但我想知道:
- Passport.js 已经提供了这样的东西或者
- 我怎样才能使它成为护照的一部分,就像一个插件一样。
我的方法大致是这样的
function optionalAuth(req, res, next) {
var authHeader = req.headers.authorization;
var token = parseToken(authHeader); // just getting the OAuth token here
if(!token) {
return next();
}
User.findOne({
token: token
}, function(err, user) {
if(err) {
return res.json(401, {message: 'auth expired'});
};
if(user) {
req.user = user;
}
next();
});
}
然而,这对我来说似乎很愚蠢,而且在 passport-auth-strategies.js 或我认为应该存在的其他身份验证层中也不行。有什么更好的方法?
如果我找到一个令牌但它是无效的,告诉我是否做正确的事情返回 401 的奖励积分 :)
【问题讨论】:
-
假设您已经具备基本功能(验证用户身份),我认为您可以使用
req.isAuthenticated()(这是 Passport 定义的)来检查您是否要返回额外的字段。 -
我不能使用 req.isAuthenticated 因为我不能把 passport.authenticate() 放在这之前。为什么?因为未经身份验证的用户会被拒绝。我没有会话,它是一个无状态 API,只是一个不记名令牌。如果我将 passport.authenticate() 放在路由中,一些用户会得到 401。我希望他们通过,只能获得有限的信息。
标签: javascript node.js authentication oauth-2.0 passport.js