Passport 身份验证和配置问题
Issues With Passport Authentication And Config
我正在开发一个完整的堆栈 Web 应用程序,正在设置注册和登录路由我已连接到本地 mongodb 用于用户模型,现在正在设置通行证配置以进行身份验证很容易(而且只是为了在图书馆练习)。问题是,即使我硬编码 return done(null, user);进入配置,它仍然 return 是错误的。
首先,这是我的登录 POST 登录页面路由:
router.post('/', async function(req, res, next) {
if (!req.isAuthenticated()) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err); }
if (!user) { return res.redirect('/'); }
req.logIn(user, function(err) {
if (err) { return next(err); }
return res.redirect('/account');
});
})(req, res, next);
}
});
这是我的 server.js 代码:
if (process.env.NODE_ENV !== "production") {
require('dotenv').config({ path: '.env' });
}
// Dependencies
const express = require('express');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const session = require('express-session');
const app = express();
// Setup
app.set('view engine', 'ejs')
app.use(express.urlencoded({ extended: false }))
app.use(express.static(__dirname + '/public'));
app.use(session({ secret: 'yeet', resave: false, saveUninitialized: false }));
// Passport Setup
const passport = require('passport');
require('./config/passport')(passport);
app.use(passport.initialize());
app.use(passport.session());
// MongoDB
mongoose.connect(process.env.MONGO_URL, { useNewUrlParser: true, useUnifiedTopology: true, 'useCreateIndex': true });
mongoose.connection.on('error', error => console.log(error));
mongoose.connection.once('open', () => console.log("Connected To Database"));
// Routes
const indexRouter = require('./routes/index');
const trendingRouter = require('./routes/trending');
const accountRouter = require('./routes/account');
app.use('/', indexRouter);
app.use('/trending', trendingRouter);
app.use('/account', accountRouter);
// Port
app.listen(3030);
这是我的配置文件本身:
const LocalStrategy = require('passport-local').Strategy;
const passport = require('passport');
const bcrypt = require('bcryptjs');
const User = require('../models/User');
module.exports = function(passport) {
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ userName: username }, function (err, user) {
if (err) return done(err);
if (!user) return done(null, false, { message: 'Incorrect username.' });
bcrypt.compare(password, user.userPassword, (err, isMatch) => {
if (err) throw err;
if (isMatch) return done(null, user);
return done(null, false, { message: 'Password incorrect' });
});
return done(null, user);
});
}
));
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
};
有趣的是,我认为我的本地配置文件从未被调用过。我尝试在其中添加 console.log("test") ,但该消息从未出现在终端中。尽管我尽可能地仔细阅读了文档,甚至还通过了一系列教程来找到我的答案,但还是空手而归。
我的问题是什么?感谢您的宝贵时间和回答。
我明白了。问题是我视图中的输入字段没有按照文档中的名称命名为 username
和 password
。这将使配置文件实际上可以从输入字段中检索必要的信息。
我正在开发一个完整的堆栈 Web 应用程序,正在设置注册和登录路由我已连接到本地 mongodb 用于用户模型,现在正在设置通行证配置以进行身份验证很容易(而且只是为了在图书馆练习)。问题是,即使我硬编码 return done(null, user);进入配置,它仍然 return 是错误的。
首先,这是我的登录 POST 登录页面路由:
router.post('/', async function(req, res, next) {
if (!req.isAuthenticated()) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err); }
if (!user) { return res.redirect('/'); }
req.logIn(user, function(err) {
if (err) { return next(err); }
return res.redirect('/account');
});
})(req, res, next);
}
});
这是我的 server.js 代码:
if (process.env.NODE_ENV !== "production") {
require('dotenv').config({ path: '.env' });
}
// Dependencies
const express = require('express');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const session = require('express-session');
const app = express();
// Setup
app.set('view engine', 'ejs')
app.use(express.urlencoded({ extended: false }))
app.use(express.static(__dirname + '/public'));
app.use(session({ secret: 'yeet', resave: false, saveUninitialized: false }));
// Passport Setup
const passport = require('passport');
require('./config/passport')(passport);
app.use(passport.initialize());
app.use(passport.session());
// MongoDB
mongoose.connect(process.env.MONGO_URL, { useNewUrlParser: true, useUnifiedTopology: true, 'useCreateIndex': true });
mongoose.connection.on('error', error => console.log(error));
mongoose.connection.once('open', () => console.log("Connected To Database"));
// Routes
const indexRouter = require('./routes/index');
const trendingRouter = require('./routes/trending');
const accountRouter = require('./routes/account');
app.use('/', indexRouter);
app.use('/trending', trendingRouter);
app.use('/account', accountRouter);
// Port
app.listen(3030);
这是我的配置文件本身:
const LocalStrategy = require('passport-local').Strategy;
const passport = require('passport');
const bcrypt = require('bcryptjs');
const User = require('../models/User');
module.exports = function(passport) {
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ userName: username }, function (err, user) {
if (err) return done(err);
if (!user) return done(null, false, { message: 'Incorrect username.' });
bcrypt.compare(password, user.userPassword, (err, isMatch) => {
if (err) throw err;
if (isMatch) return done(null, user);
return done(null, false, { message: 'Password incorrect' });
});
return done(null, user);
});
}
));
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
};
有趣的是,我认为我的本地配置文件从未被调用过。我尝试在其中添加 console.log("test") ,但该消息从未出现在终端中。尽管我尽可能地仔细阅读了文档,甚至还通过了一系列教程来找到我的答案,但还是空手而归。
我的问题是什么?感谢您的宝贵时间和回答。
我明白了。问题是我视图中的输入字段没有按照文档中的名称命名为 username
和 password
。这将使配置文件实际上可以从输入字段中检索必要的信息。