Реагировать на проблему аутентификации приложения: req.session.passport создается при входе в систему, но исчезает после перенаправления - PullRequest
0 голосов
/ 15 февраля 2020

Я новичок в React. У меня возникают проблемы с пониманием того, что происходит с моим объектом req.session.passport, который создается при входе пользователя в приложение. При входе в приложение я получаю в консоли следующее:

axios.post(/login) response: login.component.js:39
Object { cookie: {…}, passport: {…} }

Проблема возникает, когда я go перехожу на другую страницу. Это появляется на консоли:

axios.get(/logged_in) response: user.component.js:37
this.state.session: user.component.js:38
Object { cookie: {…} }

Откуда взялся паспорт объекта go? Мне нужно, чтобы он реагировал на то, кто вошел в систему. Я вызываю req.session в обоих путях ax ios, поэтому я ожидаю увидеть точно такой же результат, но я не вижу. Ни одна из тем, достаточно похожих на мою ситуацию, не помогла мне разобраться в этой проблеме.

Функция onSubmit (e) из компонента входа в систему:

onSubmit(e) {
    e.preventDefault();

    axios.post("http://localhost:4000/users/login", {
        username: this.state.username,
        password: this.state.password
    }).then(res => {
        console.log("axios.post(/login) response: ");
        console.log(res.data);
        if (res.status === 200) {
            this.props.updateSession({
                session: res.data
            });
        }
    }).catch(err => {
        console.log("Login error: ");
        console.log(err);
    });
    this.props.history.push("/");
}

Маршрут, который вышеуказанная функция использует для аутентификации user:

router.post("/login", passport.authenticate("local"), (req, res) => {
    console.log("Calling router.post(/login)...");
    console.log("req.session: ", req.session);
    res.status(200).json(req.session);
});

Функция componentDidMount () от основного пользовательского компонента, который проверяет, активен ли сеанс:

  componentDidMount() {
    axios.get("http://localhost:4000/users/logged_in").then(res => {
      this.setState({
        session: res.data
      });
      console.log("axios.get(/logged_in) response: ");
      console.log("this.state.session: ");
      console.log(this.state.session);
    }).catch(err => {
      console.log(err);
    })
  }

Маршрут, который использует вышеуказанная функция. Очень похоже на маршрут входа в систему за вычетом аутентификации:

router.get("/logged_in", (req, res) => {
    console.log("Calling router.get(/logged_in)...");
    res.status(200).json(req.session);
});

localStrategy. js (Паспорт):

const User = require("../database/models/user.model"),
LocalStrategy = require('passport-local').Strategy;

const strategy = new LocalStrategy(
    {
        usernameField: "username" // not necessary, DEFAULT
    },
    function(username, password, done) {
        User.findOne({ username: username }, (err, user) => {
            if (err) {
                return done(err)
            }
            if (!user) {
                return done(null, false, { message: "Incorrect username" })
            }
            if (!user.checkPassword(password)) {
                return done(null, false, { message: "Incorrect password" })
            }
            return done(null, user)
        })
    }
)

module.exports = strategy;

index. js (Паспорт):

const passport = require("passport"),
LocalStrategy = require("./localStrategy"),
User = require("../database/models/user.model");

passport.serializeUser((user, done) => {
    console.log("*** serializeUser called, user: ");
    console.log(user);
    console.log('---------');
    done(null, { _id: user._id });
})

passport.deserializeUser((id, done) => {
    console.log("DeserializeUser called");
    User.findOne(
        { _id: id },
        "username",
        (err, user) => {
            console.log("*** Deserialize user, user:");
            console.log(user);
            console.log("--------------");
            done(null, user);
        }
    )
})

passport.use(LocalStrategy);

module.exports = passport;

console.log результат описанного выше serializeUser ():

*** serializeUser called, user:
{ isAdmin: false,
  orders: [],
  createdAt: 2020-02-11T02:09:18.992Z,
  _id: 5e420cdb...,
  username: 'user',
  password:
   '$2a$1...',
  __v: 0 }

сервер. js:

const express = require("express"),
app = express(),
bodyParser = require("body-parser"),
session = require("express-session"),
MongoStore = require('connect-mongo')(session),
cors = require("cors"),
PORT = 4000,

// Require routes
productRoutes = require("./routes/products"),
orderRoutes = require("./routes/orders"),
userRoutes = require("./routes/users"),
passport = require('./passport'),
dbConnection = require('./database');

app.use(bodyParser.json());
app.use(cors());

// Sessions
app.use(
    session({
        secret: "Birdhouses are cool.", // Secret can be any string
        store: new MongoStore({ mongooseConnection: dbConnection }),
        resave: false,
        saveUninitialized: false
    })
);

app.use(passport.initialize());
app.use(passport.session()); // calls serializeUser and deserializeUser

// Routes config
app.use("/products", productRoutes);
app.use("/orders", orderRoutes);
app.use("/users", userRoutes);

// Start server
app.listen(PORT, function() {
    console.log("Server is running on Port: " + PORT);
});

Модель пользователя:

const mongoose = require("mongoose"),
bcrypt = require("bcryptjs");

// Define user schema
let userSchema = new mongoose.Schema({
    username: {
        type: String
    },
    password: {
        type: String
    },
    isAdmin: {
        type: Boolean,
        default: false
    },
    orders: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: "Order"
    }],
    createdAt: {
        type: Date,
        default: Date.now()
    }
});

userSchema.methods = {
    checkPassword: function(inputPassword) {
        return bcrypt.compareSync(inputPassword, this.password);
    },
    hashPassword: plainTextPassword => {
        return bcrypt.hashSync(plainTextPassword, 10);
    }
}

userSchema.pre("save", function(next) {
    if (!this.password) {
        console.log("models/user.js =======NO PASSWORD PROVIDED=======")
        next();
    } else {
        console.log("models/user.js hashPassword in pre save");

        this.password = this.hashPassword(this.password);
        next();
    }
})

module.exports = mongoose.model("User", userSchema);
...