护照本地策略没有被调用
我确定我在这里错过了一些非常明显的东西,但我无法弄清楚这一点。 当传递login表单时,我传递给LocalStrategy构造函数的函数不会被调用。
码:
var express = require('express'); var http = require('http'); var path = require('path'); var swig = require('swig'); var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; passport.serializeUser(function(user, done) { console.log('Serialize user called.'); done(null, user.name); }); passport.deserializeUser(function(id, done) { console.log('Deserialize user called.'); return done(null, {name: 'Oliver'}); }); passport.use(new LocalStrategy( function(username, password, done) { console.log('local strategy called with: %s', username); return done(null, {name: username}); })); var app = express(); app.set('port', process.env.PORT || 3000); app.set('view engine', 'swig'); app.set('views', __dirname + '/views'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieParser('asljASDR2084^^!')); app.use(express.session()); app.use(passport.initialize()); app.use(passport.session()); app.use(app.router); app.use(require('less-middleware')({ src: __dirname + '/public' })); app.use(express.static(path.join(__dirname, 'public'))); app.use(express.errorHandler({ dumpExceptions:true, showStack:true })); app.engine('swig', swig.renderFile); app.post('/auth', passport.authenticate('local')); app.get('/login', function(req, res) { // login is a simple form that posts username and password /auth res.render('login', {}); }); http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); });
我/login页面上的表格是从护照文档中剪切和粘贴的,除了我将其更改为/ auth而不是/ login:
<form action="/auth" method="post"> <div> <label>Username:</label> <input type="text" name="username"/> </div> <div> <label>Password:</label> <input type="password" name="password"/> </div> <div> <input type="submit" value="Log In"/> </div> </form>
当我提交login表单时,会logging下列内容
GET /login 200 5ms - 432b POST /auth 401 6ms
请注意,“本地策略调用”从不logging。
为什么我传递给LocalStrategy的函数没有被调用?
我最近遇到这个问题,可能是由一些事情造成的。 首先要检查的是确保bodyParser被设置为快速,我看到你已经完成了。
app.use(express.bodyParser());
接下来要确保提交给路由的表单既包含username
包含password
, 用户还必须在两个字段中input内容 。 我被困住了一下testing它,而不是实际上把任何东西放在密码字段,而testing:) Passport需要两个执行LocalStrategyvalidationfunction传递给passport.authenticate('local')
。
您的示例似乎也设置为正确捕获用户名和密码,但无论如何,您应该尝试testing即使没有护照也正确parsing正文:
app.post('/auth', function(req, res){ console.log("body parsing", req.body); //should be something like: {username: YOURUSERNAME, password: YOURPASSWORD} });
其他
你尝试添加一个请求处理程序到你的/auth
路由吗?
app.post('/auth', passport.authenticate('local'), function(req, res){ console.log("passport user", req.user); });
要么
app.post('/auth', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/auth' }));
当您使用不同的用户名,密码input字段比默认的字段时,你得到401。 你必须在你的LocalStrategy中提供这样的内容:
passport.use(new LocalStrategy({ usernameField: 'login', passwordField: 'password' }, function(username, password, done) { ... } ));
默认是username
和password
我想。 看到这里的文档。
我想你提交的表单用户名或密码字段为空。
如果你填写两个input然后提交,LocalStrategy将被调用。
当我设置自己的路由处理程序(从中调用passport.authenticate())时遇到了同样的问题。 我忘记了passport.authenticate返回必须被调用的中间件,所以只调用passport.authenticate是不够的。 然后我换了
router.post("/", function(req,res,next){ passport.authenticate("local", function(err, user, info){ // handle succes or failure }); })
同
router.post("/", function(req,res,next){ passport.authenticate("local", function(err, user, info){ // handle succes or failure })(req,res,next); })
对于Express 4.x:
// Body parser var bodyParser = require('body-parser'); app.use(bodyParser.urlencoded({ extended: false })) // parse application/x-www-form-urlencoded app.use(bodyParser.json()) // parse application/json
几个小时之后,我也为了这个问题而ban my不安。 正如其他答案所告知的那样,所有的事情都是这样的。1. Form返回所有字段。 2.身体parsing器正确设置与扩展:真3.护照与每一个设置和configuration。
但是我已经更改了phoneNumber和密码的用户名字段。 通过更改下面的代码解决了我的问题
passport.use('login', new LocalStrategy( {usernameField:'phoneNumber', passwordField:'password'}, function (username, password, done) { // your login goes here })
);
如果任何人想要我可以使用mongodb和护照本地编写整个身份validation程序的电话号码。
谢谢@ user568109
我的问题是,我有enctype ='multipart / form-data'。 只要将其改为multipart ='urlencoded'。 而且我认为这将解决它。
有可能你的请求没有正确的格式(特别是它的主体),你的用户名和密码没有被发送。
下面是一个API调用包装的例子,它强制你的请求体被parsing为json:
Api = {}; Api.request = (route, options) => { options = options || {}; options.method = options.method || 'GET'; options.credentials = 'include'; if (options.method === 'POST') { options.headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', }; options.body = JSON.stringify(options.data) || '{}'; } fetch(absoluteUrl + '/api/' + route, options) .then((response) => response.json()) .then(options.cb || (() => {})) .catch(function(error) { console.log(error); }); };
它可以这样使用:
Api.request('login', { data: { username: this.state.username, password: this.state.password }, method: 'POST', cb: proxy((user) => { console.log(user); }, this) });
对我来说,一切安装正确..问题是,我正在收集表单数据,然后从表单数据创build一个JSON并将其发送像JSON.stringify(formdatajson)到服务器。 (对我来说login表单是在屏幕上popup)
我通过debuggingpassportjs发现我的错误…
如果你也有同样的问题,并没有上述解决scheme似乎为你工作,然后debuggingpassportjs。
打开
strategy.js
把debugging器放在下面的方法中。
Strategy.prototype.authenticate
检查什么样的表格数据是为你准备的。 希望这个帮助…
-
npm安装passport-local
-
var passport = require('passport'),LocalStrategy = require('passport-local')。
根据passportjs.org ,它为我工作!