node.js - Passport 本地策略没有被调用

标签 node.js express passport.js

我确定我在这里遗漏了一些非常明显的东西,但我无法弄清楚这一点。当登录表单被提交时,我传递给 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 页面上的表单是从 Passport 文档中剪切和粘贴的,只是我将其更改为提交到/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>

当我 sumit 登录表单时,会记录以下内容

GET /login 200 5ms - 432b
POST /auth 401 6ms

请注意,“本地策略调用”永远不会被记录。

为什么我传递给 LocalStrategy 的函数没有被调用?

最佳答案

我最近遇到了这个问题,它可能是由多种原因引起的。首先要检查的是确保 bodyParser 设置为 express,我看到你已经完成了。

app.use(express.bodyParser());

接下来要确保您提交给路由的表单包含两个 usernamepassword , 并且用户还必须在这两个字段中输入内容。我很难对它进行一些测试,并且在测试时实际上没有在密码字段中输入任何内容 :) Passport 需要 BOTH 来执行传递给 passport.authenticate('local') 的 LocalStrategy 验证功能.

您的示例似乎也设置为正确捕获用户名和密码,但无论如何,您应该尝试测试即使没有 Passport 也可以正确解析正文:

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' }));

关于node.js - Passport 本地策略没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18690354/

相关文章:

javascript - 无法设置 JavaScript 对象的属性

node.js - express-restify-mongoose 错误传播

javascript - Passport.js 的验证错误

node.js - 使用 Tomcat 和 NodeJS 进行单点登录

javascript - JavaScript 中的 const 和 const {} 有什么区别

node.js - 将 Google 功能与 Node-express-passport 结合使用

node.js - 如何使用 postman 在nodejs中测试快速 session 类型的 session ?

javascript - npm 错误!无关的 : pug@2. 0.0-alpha6

node.js - 如何在node.js Passport 中通过twitter登录后使用访问 token 对用户进行身份验证

android - 我正在尝试制作一个应用程序,它将从号码列表中一个接一个地调用电话