node.js - Passportjs 本地身份验证总是失败
问题描述
我正在尝试使用护照实现本地登录,但总是失败重定向,即使我在策略上放置了 console.log 但未显示在控制台上,这表明此功能尚未完成,但我没有任何错误
风景
<form action="/login" method="post">
<input type="text" name="username" id="username">
<input type="password" name="password" id="password">
<input type="submit" value="Iniciar sesión">
</form>
index.js
const express = require('express')
const app = express()
const { I18n } = require('i18n')
const path = require('path');
//const i18n = new I18n()
const router = require('./routes/routes.js')
const config = require('./config/config.js')
var morgan = require('morgan')
const mongoose = require('mongoose');
const db = mongoose.connection;
const session = require('express-session')
const flash = require('connect-flash');
const passport = require('passport');
const User = require('./models/user');
/*i18n.configure({
locales: ['es', 'en'],
directory: path.join(__dirname, '/locales'),
defaultLocale: 'es',
register: global
})*/
app.use(session({
secret: config.session_secret,
resave: false,
saveUninitialized: false
}))
app.use(passport.initialize())
app.use(passport.session())
app.use(express.static(__dirname + '/public'));
app.use(flash());
//app.use(morgan('combined'))
/*para utilizar el i18n con twig
app.use(function(req, res, next) {
// express helper for natively supported engines
res.locals.__ = res.__ = function() {
return i18n.__.apply(req, arguments);
};
next();
});*/
//rutas
app.use(router)
mongoose.connect( config.db_connect, {
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false,
useCreateIndex: true
});
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
console.log('Database successfull connection!!');
app.listen(config.port, () => {
console.log(`ChatLearning app listening at http://localhost:${config.port}`)
})
});
路由.js
const express = require('express');
const router = express.Router();
const registerController = require('../controllers/registerController');
const loginController = require('../controllers/loginController');
var bodyParser = require('body-parser');
const User = require('../models/user');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const authMiddleware = require('../middleware/authMiddleWare');
// parse application/json
var jsonParser = bodyParser.json()
// create application/x-www-form-urlencoded parser
var urlencodedParser = bodyParser.urlencoded({ extended: false })
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
passport.use('local-signin', new LocalStrategy({
passReqToCallback: true
}, async (req, email, password, done) => {
const user = await User.findOne({email: email});
console.log('user', user);//this log its not being shown on the console
if(!user) {
return done(null, false, req.flash('signinMessage', 'No User Found'));
}
if(!user.comparePassword(password)) {
return done(null, false, req.flash('signinMessage', 'Incorrect Password'));
}
return done(null, user);
}));
router.post('/login',
passport.authenticate('local-signin', {
successRedirect: '/',
failureRedirect: '/login',
failureFlash: true
})
);
router.get('/',(req, res) => {
res.send('Página principal')
})
router.get('/login', loginController.login);
router.get('/registro', registerController.register);
router.post('/registro', urlencodedParser, registerController.registerUser);
module.exports = router
我不知道我是否错过了什么,但我认为我没有忘记任何东西
解决方案
默认情况下,LocalStrategy
期望在名为用户名和密码的参数中找到凭据。如果您的站点希望以不同的方式命名这些字段,则可以使用选项来更改默认值
passport.use('local-signin', new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true,
session: true }, function(req, username, password, done){
// request object is now first argument // ...
}));
推荐阅读
- android - 在android studio中加载设备变灰如何解决这个问题?
- spring-boot - Thymeleaf 使用参数作为字符串
- arrays - 您可以更改作为状态的多维数组的特定值吗?
- mongodb - 如何从文档中的列表中查询两个条件必须同时为真
- python - Python Beautifulsoup 无法获取 svg 标签
- python - 使用带有 SSL 的 sqlalchemy 和 pg8000 连接到数据库的正确方法是什么?
- javascript - 在python中执行Javascript的语法
- typescript - 扩展多个接口的更好方法
- java - 在 Junit 5 中使用 Mockito 静态模拟时如何抛出 InterruptedException?
- apache - 子域HTTP和HTTPS去不同的目录,Apache2.4