0

所以我在这里有点问题。我有我的登录路线:

var express = require('express');
var router = express.Router();
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
require('../config/passport')(passport, LocalStrategy);


/* GET /login */
router.get('/', function(req, res) {
  //you'll probably write some 
res.render('login', { title: 'Please Log In' });
});

router.post('/', function(req, res) {
console.log('posting');
console.log(passport);
passport.initialize();
passport.session();
passport.authenticate('local', { successRedirect: '/',
                                 failureRedirect: '/login'
                                });
console.log('after');
});
module.exports = router;

我的 app.js:

var express = require('express'),
  path = require('path'),
  favicon = require('serve-favicon'),
  logger = require('morgan'),
  cookieParser = require('cookie-parser'),
  bodyParser = require('body-parser'),
  session = require('express-session'), 
  RedisStore = require('connect-redis')(session),
  passport = require('passport'),

  //  LocalStrategy = require('passport-local').Strategy,
  pool = require('./config/database'),

  routes = require('./routes/index'),
  api = require('./routes/api'),
  login = require('./routes/login'),

  app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// uncomment after placing your favicon in /public
//app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(session(<<redis store info>>);
app.use(passport.initialize());
app.use(passport.session());


app.use('/', routes);
app.use('/api', api);
app.use('/login', login);
...etc

和我的 ./config/passport.js

var pool = require('./database');

module.exports = function(passport, LocalStrategy) {


passport.serializeUser(function(user, done) {
    done(null, user.id);
});

// used to deserialize the user
passport.deserializeUser(function(id, done) {
    mysql.query("select * from users where id = "+id,function(err,rows){    
        done(err, rows[0]);
    });
});

passport.use(new LocalStrategy({
    usernameField : 'username',
    passwordField : 'password',
    passReqToCallback : true // allows us to pass back the entire request to the callback
},
function(req, username, password, done) { // callback with user and password from our form
    console.log('hi');
     pool.query("SELECT * FROM `users` WHERE `user` = '" + username + "'",function(err,rows){
        if (err)
            return done(err);
         if (!rows.length) {
            return done(null, false, req.flash('loginMessage', 'No user found.')); // req.flash is the way to set flashdata using connect-flash
        } 

        // if the user is found but the password is wrong
        if (!( rows[0].password == password))
            return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); // create the loginMessage and save it to session as flashdata

        // all is well, return successful user
        return done(null, rows[0]);         

    });

}));

};

而且我真的不明白为什么护照配置似乎根本没有得到处理。当我打电话给 passport.authenticate 它似乎什么也没做

4

1 回答 1

3

所以,我做了一些事情来让它发挥作用。首先是我将以下内容移入了 passport.js 在我的路线中与 require() 护照相关的任何内容都是疯狂的。我一开始没有这个烂摊子,但试图修补已经到了那个地步。此外,我的反序列化函数错误地有一个 mysql 引用而不是我的池。

var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;

然后我只是在配置中像往常一样设置护照,并做了

module.exports = passport;

然后在 app.js 中执行此操作:

var passport = require('../config/passport');

然后我改变了我的路由器,基本上删除了 post 功能上的全部内容,然后做了:

router.post('/', passport.authenticate('local', { successRedirect: '/',
                                                  failureRedirect: '/login'
                                                 }));

我了解到我不能只调用passport.authenticate。它应该被放置在一个 req 处理程序中。

对于完全疯狂和模棱两可的问题,我们深表歉意。以防万一任何可怜的灵魂在后面寻找这个,我想我至少需要有礼貌地谈论它。

于 2014-09-29T12:14:53.527 回答