我正在尝试实现passport.js来为我的节点应用程序创建用户身份验证系统。我正在使用express作为Web应用程序框架,使用本地护照作为策略,并且正在尝试实现session.js。对于数据库管理,我的用户是waterline.js和sails-mysql适配器。
问题是,如果我提交表单,则似乎无法使用登录策略进行身份验证。我写了几个console.log()来查看错误是什么,但是什么都没有输出到控制台。
router.post仅执行failureRedirect。
相关的app.js代码:
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var session = require('express-session');
var bodyParser = require('body-parser');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
// middleware use statements
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({
extended: false
}));
app.use(cookieParser());
app.use(session({
secret: "cats"
}));
app.use(require('flash')());
app.use(bodyParser.urlencoded({
extended: false
}));
app.use(passport.initialize());
app.use(passport.session());
// use public files
app.use(express.static(path.join(__dirname, 'public')));
// (de)serialization of user
passport.serializeUser(function(user, done) {
console.log('serializing user: ');
console.log(user);
done(null, user.user_id);
});
passport.deserializeUser(function(user_id, done) {
app.models.user.findById(user_id, function(err, user) {
console.log('deserializing user:', user);
done(err, user);
});
});
// passport Authentication strategie setup
passport.use('login', new LocalStrategy({
passReqToCallback: true
},
function(username, password, done) {
app.models.user.findOne({
username: username
}, function(err, user) {
if (err) {
console.log('error occurred: ' + err);
return done(err);
}
if (!user) {
console.log('user nog found');
return done(null, false, {
message: 'There is no account on this email address.'
});
}
if (!user.validPassword(password)) {
console.log('user found but incorrect password');
return done(null, false, {
message: 'incorrect password.'
});
}
console.log('ingelogd!');
return done(null, user);
});
}
));
// router (index.js) user statement
var indexRouter = require('./routes/index')(passport);
app.use('/', indexRouter);
相关的index.js代码(路由器):
var express = require('express');
var router = express.Router();
var archiveController = require('../controllers/archiveController');
var dashboardController = require('../controllers/dashboardController');
var homeController = require('../controllers/homeController');
var reglogController = require('../controllers/reglogController');
var userController = require('../controllers/userController');
module.exports = function(passport) {
/// home routes ///
// GET home page
router.get('/', homeController.index);
/// reglog routes ///
// GET reglog page
router.get('/reglog', reglogController.reglog_page);
// login
router.post('/reglog/login', passport.authenticate('login', {
successRedirect: '/',
failureRedirect: '/reglog',
failureFlash: true
}));
// register
router.post('/reglog/register', reglogController.reglog_register);
相关的html代码(使用哈巴狗):
form(action="/reglog/login" method= 'post')
label(class="mdc-text-field email-text-field mdc-text-field--outlined")
input(type="text" class="mdc-text-field__input" aria-labelledby="email")
div(class="mdc-notched-outline")
div(class="mdc-notched-outline__leading")
div(class="mdc-notched-outline__notch")
span(class="mdc-floating-label" id="my-label-id") e-mail address
div(class="mdc-notched-outline__trailing")
label(class="mdc-text-field password-text-field mdc-text-field--outlined")
input(type="password" class="mdc-text-field__input" aria-labelledby="password")
div(class="mdc-notched-outline")
div(class="mdc-notched-outline__leading")
div(class="mdc-notched-outline__notch")
span(class="mdc-floating-label" id="my-label-id") password
div(class="mdc-notched-outline__trailing")
button(class="mdc-button mdc-button--raised confirm-button" type='submit' value='Log In')
div(class="mdc-button__ripple")
i(class='material-icons mdc-button__icon' aria-hidden='true') check
span(class="mdc-button__label") log in
我最初有一个像这样设置的控制器,但这可能不正确吗?然后,index.js路由器将router.post('/ reglog / login',reglogController.reglog_login)作为路由代码。
var user = require('../models/userModel');
var passport = require('passport');
exports.reglog_page = function(req, res) {
res.render('reglogView', {
title: 'reglog page'
});
}
exports.reglog_login = passport.authenticate('login', {
successRedirect: '/',
failureRedirect: '/reglog',
failureFlash: true
});
exports.reglog_register = function(req, res) {
res.send('not yet impl');
}
我的文件结构如下:
C:.
│ app.js
│ package-lock.json
│ package.json
│
├───bin
│ www
│
├───controllers
│ archiveController.js
│ dashboardController.js
│ homeController.js
│ reglogController.js
│ userController.js
│
├───models
│ │ datapointModel.js
│ │ simulationModel.js
│ │ userModel.js
│ │
│ └───config
│ config.js
│ index.js
│
├───public
│ ├───images
│ ├───javascripts
│ │ reglog.js
│ │
│ └───stylesheets
│ │ navbar.css
│ │ reglog.css
│ │ style.css
│ │
│ └───dist
│ bundle.css
│ bundle.js
│
├───routes
│ index.js
│
└───views
archiveView.pug
dashboardView.pug
error.pug
homeView.pug
layout.pug
reglogView.pug
userView.pug
由于我只是刚刚开始对Web应用程序进行编程,所以我在代码中看不到错误。任何帮助表示赞赏。如果需要更多代码片段,我很乐意提供。