是否有来自Passport.js的可选身份验证中间件?
假设我有一条路线,/api/users。我只想向公众提供一个用户列表,但是对于经过身份验证的人,我想添加更多的字段。
目前,我只有一个简单的自定义方法来做同样的事情,但是我想知道:
我的方法,粗略地看上去
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();
});
}然而,在我看来,这似乎是愚蠢的,也不是在护照有什么更好的方法去做呢?
如果我找到了一个标记,但是它是无效的,那么告诉我如果我正在做正确的事情,返回401是有好处的:)
发布于 2014-09-14 10:51:23
下面是一个简单的PoC:
var express = require('express');
var app = express();
var server = app.listen(3012);
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
app.use(passport.initialize());
passport.use(new LocalStrategy(function(username, password, done) {
if (username === 'foo' && password === 'bar') {
return done(null, { username : 'foo' });
}
return done(null, false);
}));
app.get('/api', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
var data = { hello : 'world' };
// Only if the user authenticated properly do we include secret data.
if (user) {
data.secret = '3133753CR37';
}
return res.send(data);
})(req, res, next);
});它正在/api端点中“手动”调用/api。这样,您就可以更好地控制如何处理身份验证错误(在您的情况下,该错误不应被视为错误,而应被视为限制输出的一种方法)。
以下是未经正确身份验证的输出:
$ curl 'localhost:3012/api?username=foo&password=wrong'
{"hello":"world"}下面是:
$ curl 'localhost:3012/api?username=foo&password=bar'
{"hello":"world","secret":"3133753CR37"}用作中间件:
var middleware = function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
req.authenticated = !! user;
next();
})(req, res, next);
};
app.get('/api', middleware, function(req, res, next) {
var data = { hello : 'world' };
if (req.authenticated) {
data.secret = '3133753CR37';
}
return res.send(data);
});发布于 2016-05-19 19:07:33
现在可能要迟到了,但anonymous护照策略正是允许这样做的。这样,公共路由既可以进行身份验证,也可以不使用身份验证,但是当它们进行验证时,您仍然可以获得与经过身份验证的用户相关的所有信息。看看这里:https://github.com/jaredhanson/passport-anonymous
https://stackoverflow.com/questions/25806339
复制相似问题