Passport.js可选authentication
有没有从Passport.js的可选身份validation中间件?
比方说,我有一个路线, /api/users
。 我只想给公众提供一个用户列表,但是为了validation用户,我想添加更多的字段。
目前我只是一个愚蠢的自定义方法,做同样的事情,但我不知道是否:
- 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或我认为应该是的其他auth层。 有什么更好的方法来做到这一点?
奖励积分告诉我,如果我做了正确的事情返回401,如果我find一个令牌,但它是无效的:)
这是一个简单的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); });
它调用passport.authenticate
在/api
端点“手动”。 这样,您就可以更好地控制如何处理身份validation错误(在您的情况下 – 不应将其视为错误,而应视为限制输出的方式)。
以下是没有正确authentication的输出:
$ 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); });
现在可能会迟到,但有一个anonymous
护照战略,以准确的这一点。 这样的公共路线可以采取authentication或不authentication,但是当他们这样做,你仍然会有与authentication用户相关的所有信息。 看看这里: https : //github.com/jaredhanson/passport-anonymous
- 我如何使用node.js来刮取需要validation的网站?
- 使用passport.js在node.js中进行身份validation后,redirect到上一页
- 使用来自envvariables的令牌从私有Github repo安装NPM包
- 使用中间件使用ExpressJS调用身份validationAPI
- Sails.js:如何使用sails-generate-auth注册用户后返回访问令牌?
- 如何向Google Analytics报告API v4进行身份validation
- 是否可以在Express上的白名单路由中应用基本身份validation/中间件?
- 什么authentication策略使用?
- SPA和node.js服务器的身份validation