护照req.login不会创建req.user

时间:2019-11-13 08:35:43

标签: node.js express session cookies passport.js

我正在尝试使用React,Node,Mysql,Express和Passport开发一个登录系统,但是我遇到了这个问题。调用req.login并将其传递给用户ID后,当我转到检查req.user的路由时,它说未定义。这是我在服务器端的代码。

const express = require("express");
const bodyParser = require("body-parser");
const cors = require("cors");
const app = express();
const session = require("express-session");
const { PORT = 8000 } = process.env;
const bcrypt = require("bcrypt");
const saltRounds = 10;
const cookieParser = require("cookie-parser");
const passport = require("passport");
var LocalStrategy = require('passport-local').Strategy;
const mysql = require("mysql");

/app.options("*", cors());
app.use(cors());
app.use(express.json()) // for parsing application/json
app.use(express.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded
// app.use(cookieParser());

app.use(
  session({
    secret: "keyboard cat",
    resave: false,
    saveUninitialized: false

    // cookie: { secure: false }
  })
);




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

const connection = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "qwertyhnjkl",
  database: "login"
});

connection.connect(err => {
  if (err) {
    console.error("Error connection to database");

  }
    else console.log("Database connected");
});



app.get('/',function (req,res){
    console.log(req.user);
    console.log(req.isAuthenticated())
    res.send('hello world')
  });

app.post("/register", (req, res) => {
  const { name, username, email, password } = req.body;
  console.log(req.body);
  bcrypt.hash(password, saltRounds, function(err, hash) {
    connection.query(
      `insert into users(Name,Username,Email,Password) values('${name}','${username}','${email}','${hash}')`,
      function(error) {
        if (error) console.error(error);
      }
    );


    connection.query("SELECT LAST_INSERT_ID() as userID", (error,results,fields) =>
     {
      if (error) throw error;
      console.log(results)
      const userID = results[0].userID;
      console.log("userid in query: " + userID);
      req.login(userID, function(err) {
        if(err) res.send(err);

        else{
          console.log("req.user in req.login: " + req.user)
          console.log("isAuthenticated: "+ req.isAuthenticated())
          console.log(req.session )
          console.log('Logged in succesfully')
          res.send("Logged in succesfully");
        } 
      });
    });


  });
});

这就是我在React中处理表单的方式:

submitRegister(event) {
    event.preventDefault();
    const data = this.state.data
    axios.post("http://localhost:8000/register", {
      name: data.name,
      username: data.username,
      email: data.email,
      password: data.password
    })
      .then(response => {
        console.log(response);
        if(response.data){
          console.log('Succesful signup');
          this.setState({ //redirect to login page
                        redirectTo: '/'
                    })
        }


      }).catch(error => {
        console.log("Sign up to server failed");
        console.log(error)
      });

  }

在我请求服务器的“ /”并在Application-> Cookies-> localhost中检查会话后,没有会话。 插入做得很好。我在数据库中得到用户名电子邮件的哈希密码。我获得了正确的用户ID,甚至获得了具有正确的用户ID(引入的最后一个)的serialize函数中的console.log

req.user in req.login: 47
isAuthenticated: true
Session {
  cookie:
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true },
  passport: { user: 47 } }
Logged in succesfully
serialize 47

这是我从服务器请求路由/注册时在控制台中得到的。现在,当我使用localhost:8000时,它说req.user是未定义的,isAuthenticated为false。

1 个答案:

答案 0 :(得分:0)

看起来像cors()是这里的问题。将其删除并在package.json中使用代理后,即可解决该问题。