我在使用mysql登录护照时遇到了一些问题。这是我的代码:
/*jshint esversion: 6 */
const LocalStrategy = require('passport-local').Strategy;
const db = require('../config/db');
const bcrypt = require('bcryptjs');
module.exports = function(passport) {
// =========================================================================
// passport session setup ==================================================
// =========================================================================
// used to serialize the user for the session
passport.serializeUser(function(user, done) {
done(null, user.id);
});
// used to deserialize the user
passport.deserializeUser(function(id, done) {
db.query('SELECT * FROM users WHERE id = ?', [id], function(err, rows) {
done(err, rows[0]);
});
});
// Local Strategy login
passport.use(new LocalStrategy(function(username, password, done) {
// Match Username
let sql = 'SELECT * FROM users WHERE username = ?';
db.query(sql, [username], function(err, rows) {
if (err)
return done(err);
if (!rows.length) {
return done(null, false, {message: 'Wrong user'});
}
// Match Password
bcrypt.compare(password, rows[0].password, function(err, isMatch) {
if(err)
return done(err);
if(isMatch){
return done(null, rows[0]);
} else {
return done(null, false, {message: 'Wrong pass'});
}
});
});
}));
};
无法POST到/ user / login
没有记录其他错误,这很奇怪,因为我已将其设置为应该工作的位置,因为我的寄存器设置方式完全相同,因此我将提供所有代码的片段首先从主文件中提取一个想法:
// Passport config
require('./config/passport')(passport);
app.use(passport.initialize());
app.use(passport.session());
// User Route
let user = require('./routes/reg');
app.use('/user', user);
好的,现在这些东西实际上在reg.js文件中用于登录路由。
// Login Process
router.post('/login', function (req, res, next) {
passport.authenticate('local', {
sucessRedirect: '/',
failureRedirect: '/',
failureFlash: true,
})(req, res, next);
});
现在POST的实际形式是:
<form method="POST" action="/user/login">
<h3><label>Username:</label></h3><input type="text" name="username" placeholder="Username" /><br>
<h3><label>Password:</label></h3><input type="password" name="password" placeholder="Password" /><br>
<br><input type="submit" name="login" value="Login"><a href="#" style="font-size: 12px;"> Lost Password?</a>
</form>
更新:似乎登录错误,它做的一切都正确,但是如果登录正确,它会执行“Cannot POST /user/login
”,所以我假设它与我的行有关:
return done(null, rows[0]);
这并不让我感到惊讶,但是我对它为什么会这样做一无所知。
好的,我确信它没有序列化用户。我一直在查找,但找不到任何东西。
答案 0 :(得分:1)
我认为登录过程存在问题。
您可以使用authenticate()
函数作为路由中间件来验证请求。像这样:
router.post('/login',
passport.authenticate('local', { failureRedirect: '/login' }),
function(req, res) {
res.redirect('/');
});