node.js - 护照身份验证和配置问题
问题描述
我正在开发一个完整的堆栈 Web 应用程序并设置注册和登录路由我已连接到本地 mongodb 的用户模型,现在正在设置护照配置以使身份验证变得容易(并且只是为了练习图书馆)。问题是,即使我硬编码返回 done(null, user); 进入配置,它仍然返回false。
首先,这是我登录页面的登录 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
因为它们应该是每个文档。这将使配置文件实际上可以从输入字段中检索必要的信息。
推荐阅读
- session-cookies - 为什么WKHTTPCookieStore的API——getAllCookies调用了completionHandler却没有session cookies包含
- python - “python svn”和“python pysvn”有什么区别?
- neo4j - 如何计算 neo4j 中树中根节点的总数?
- javascript - 无法弄清楚如何在不和谐服务器中为每个用户添加表,没有给出错误
- python - 如何在django模型中设置字段的值等于函数的返回
- java - Google AppEngine - 无法分配内存错误
- multithreading - 有没有比 mciSendString 更好的播放 Mp3 的方法?
- android - 如何比较 JNI 中的两个 jbyteArray?
- kotlin-coroutines - 如何将挂起函数作为参数传递给另一个函数?Kotlin 协程
- node.js - 使用 Firebase 根据身份验证状态提供动态内容