首页 > 解决方案 > 护照身份验证和配置问题

问题描述

我正在开发一个完整的堆栈 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") ,并且该消息永远不会出现在终端中。尽管我尽可能地密切关注文档,甚至阅读了一系列教程来找到我的答案,但还是空手而归。

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

标签: node.jsmongodbauthenticationpostpassport.js

解决方案


我想到了。问题是我的视图上的输入字段没有被调用usernamepassword因为它们应该是每个文档。这将使配置文件实际上可以从输入字段中检索必要的信息。


推荐阅读