passport.authenticate("local")(req, res, function () {} 块未执行

问题描述 投票:0回答:4

我是 MERN(Mongo、Express、React、Node)的新手,正在使用它来创建一个应用程序。我看到了一个关于护照的教程,并完全按照教程中所示的方式实现了它,但我不断收到“错误请求”在屏幕上渲染。

在课程中,我使用了教练使用的护照进行express-ejs,我只是推断出反应。

根据我所做的调试 - Passport.authenticate() 函数永远不会被执行。哈希密码和电子邮件被记录到我的 mongo 服务器,但它从未得到验证。我花了一整天的时间尝试调试,但没有成功。

下面是我输入的服务器端代码。 Localhost:5000 是我的 Express 服务器,localhost:3000 是 React 服务器任何帮助将不胜感激。错误代码 400 顺便说一句

 * Require Dependencies 
 */
const express = require('express');
const bodyParser = require('body-parser');
const ejs = require('ejs');
const mongoose = require('mongoose');
const session = require('express-session');
const passport = require("passport");
const passportLocalMongoose = require("passport-local-mongoose");

const app = express();

app.use(express.static("public"));
app.use(bodyParser.urlencoded({
    extended: true
}));

app.use(session({
    secret: "Our little secret.",
    resave: false,
    saveUninitialized: false
}));


app.use(passport.initialize());
app.use(passport.session());

mongoose.connect("mongodb://localhost:27017/userDB", {useNewUrlParser: true, useUnifiedTopology: true});
mongoose.set("useCreateIndex", true);

const userSchema = new mongoose.Schema({
    email: String,
    password: String
});

userSchema.plugin(passportLocalMongoose);

const User = new mongoose.model("User", userSchema);


passport.use(User.createStrategy());

passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

////////////////////////////// Get Request Block //////////////////////////////
app.get("/secrets", function (req, res) {
    if (req.isAuthenticated()) {
        res.redirect("http://localhost:3000/secrets");
    } else {
        res.redirect("/register");
    }
});
/////////////////////////////////////////////////////////////////////////////////

app.post("/register", function (req, res) {

    User.register({ username: req.body.emailId }, req.body.password, function (err, user) {
        if (err) {
            console.log(err);
            res.redirect("/error");
        } else {
            console.log("me");
            passport.authenticate("local")(req, res, function () {
                console.log("met1e1e");
                res.redirect("/secrets");
            });

            // passport.authenticate('local', {
            //     successRedirect: '/secrets',
            //     failureRedirect: '/error',
            //     failureFlash: true
            // });
        }
    });

});

app.get("/error", function (req, res) {
   console.log("debug:wrkbj");
   res.redirect("http://localhost:3000/main");
});


app.listen(5000, function () {
    console.log("Server live on port 5000.");
});

node.js reactjs passport.js passport-local
4个回答
0
投票
  1. 将您的架构更改为- const userSchema = new mongoose.Schema({ 用户名:字符串, 密码:字符串 });

  2. 在你的 app.post("/register" ... 部分,将用户名设置为- { 用户名:req.body.用户名 }

由于您的注册方法注册了一个新用户,其中电子邮件存储在用户名中,因此您不能在 userSchema 中使用“电子邮件”。 您还应该将views文件夹中的register.ejs文件中的所有“emailId”名称属性替换为“username”。这将解决问题。


0
投票

在 app.get("/secrets") 路由中使用

res.render("secrets");
,而不是 URL
res.redirect("http://localhost:3000/secrets");
它将起作用。无需更改为 用户名 而不是 电子邮件 ID


0
投票

您应该添加一个 if 语句来捕获用户是否正在退出。然后就可以正常工作了。

    if(user){
    passport.authenticate("local")(req, res, function (){
      res.redirect("/secrets");
    });
  }

0
投票

将其与您的代码进行比较

 app.get('/secrets', (req, res) => {
    if (req.isAuthenticated()) {
        res.render("secrets");
    } else {
        res.redirect('/login');
    }
}); 
    User.register({ username: req.body.username }, 
    req.body.password).then(function(user) {
           if (user) {
               passport.authenticate("local")(req, res, 
    function() {
                   res.redirect("/secrets");
               })
          }
    }).catch(function(err) {
        console.log(err);
        res.redirect("/register")
    })
 
© www.soinside.com 2019 - 2024. All rights reserved.