护照身份验证和配置问题

时间:2021-03-22 20:54:35

标签: node.js mongodb authentication post passport.js

我正在开发一个全栈 web 应用程序,正在设置注册和登录路由我已经连接到本地 mongodb 的用户模型,现在正在设置护照配置以使身份验证变得容易(并且只是在图书馆练习)。问题是,即使我硬编码 return 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") ,但该消息从未出现在终端中。我尽可能密切地遵循文档,甚至通过一系列教程来找到我的答案,但空手而归。

我有什么问题?感谢您的时间和回答。

1 个答案:

答案 0 :(得分:0)

我想通了。问题是我视图中的输入字段没有按照文档的名称命名为 usernamepassword。这将使配置文件实际上可以从输入字段中检索必要的信息。