Passport.js可选身份验证
Passport.js optional authentication
Passport.js中是否有可选的身份验证中间件?
假设我有一条路线,/api/users
。我只想向公众提供一个用户列表,但对于经过身份验证的人,我想添加更多的字段。
目前,我只有一个愚蠢的自定义方法可以做同样的事情,但我想知道是否:
- Passport.js已经提供了这样的东西或者
- 我如何才能让它成为passport的部分,就像插件一样
我的方法,大致上,看起来像
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,这将获得额外的积分:)
现在可能会迟到,但有一个anonymous
Passport策略可以做到这一点。这样,公共路由可以进行身份验证也可以不进行身份验证,但当进行身份验证时,您仍然可以获得与经过身份验证的用户相关联的所有信息。点击此处查看:https://github.com/jaredhanson/passport-anonymous
这里有一个简单的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
端点中"手动"调用passport.authenticate
。这样,您就可以更好地控制如何处理身份验证错误(在您的情况下,不应将其视为错误,而应将其作为限制输出的一种方式)。
以下是没有正确身份验证的输出:
$ 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);
});
相关文章:
- Passport.js成功的身份验证根本没有调用
- 使用Microsoft Office.js加载项进行自动身份验证
- 在JS Metro应用程序中,禁止登录屏幕进行基本身份验证
- 使用Sails.JS为静态HTML/JS应用程序提供身份验证
- ExpressJs+Passport.js+MySQL身份验证
- 基本node.js express身份验证不起作用
- 使用用户名和密码使用node js,AngularJs和JWT进行身份验证
- 如何使用不同的API's在同一个Angular JS应用程序中具有不同的身份验证标头
- Passport js通过url进行身份验证
- 流星js中没有服务的用户身份验证
- req.user在使用express服务器passport.js进行twitter身份验证后未定义
- 使用基于令牌的身份验证保护Sails.js中的API路由
- 使用 Angular.js 处理基于 OAuth 令牌的身份验证
- 如何使用 ntlm 在 node.js 应用程序中设置身份验证层
- Ember.js身份验证操作不起作用
- 节点.js具有“持久性令牌”功能的身份验证库
- Adal.js不触发身份验证
- 使用Stormpath的Node.Js身份验证
- 护照.js用户登录和身份验证
- 对节点中的请求进行身份验证.js针对 Wordpress