You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取当前会话用户信息?req.user为undefined、req.isAuthenticated为false

无法通过Passport获取已认证用户的会话信息(req.user返回undefined,req.isAuthenticated()返回false)

Stack Overflow上已有大量相关主题的问答,但均未解决我的问题。

我需要获取已认证用户的当前会话信息,以此提交和获取该用户的专属数据。目前存在用户可访问他人数据的问题,之前在server.js根目录定义全局profile变量存储最后登录用户数据的方案有严重缺陷,现在要正确管理会话,确保用户仅能访问自身数据。

我知道可以通过req.user获取用户信息,但始终无法拿到有效内容,req.isAuthenticated()也返回false,其他功能都正常运行(相关代码见lib.js中的getUser函数)。

项目采用React前端,Mongoose、Node、Passport、Express后端,通过API实现前后端通信,已部署在Heroku平台。


Server.js

const express = require("express");
const mongoose = require("mongoose");
const bodyParser = require("body-parser");
const passport = require("passport");
const User = require("./schema/schemaUser.js");
const session = require('cookie-session');
const cookieParser = require('cookie-parser')
const cors = require('cors');
const path = require('path');
require('dotenv').config();

//Depreciation warnings
mongoose.set('useNewUrlParser', true);
mongoose.set('useFindAndModify', false);
mongoose.set('useCreateIndex', true);

//Connexion à la base de donnée
mongoose
  .connect(process.env.mongoURL, { useNewUrlParser: true, useUnifiedTopology: true  })
  .then(() => {
    console.log("Connected to mongoDB");
  })
  .catch((e) => {
    console.log("Error while DB connecting");
    console.log(e);
  });

//On définit notre objet express nommé app
const app = express();
app.use(cookieParser())

if(process.env.NODE_ENV === 'production') {
  app.use(express.static(path.join(__dirname, 'client', 'build')));

   //Body Parser
   const urlencodedParser = bodyParser.urlencoded({
     extended: true
   });
   app.use(urlencodedParser);
   app.use(bodyParser.json());
   app.use(session({
        secret: process.env.secret,
        resave: false,
        saveUninitialized: false
    }));

   //PASSPORT
   app.use(passport.initialize());
   app.use(passport.session());
   passport.use(User.createStrategy());

   passport.serializeUser(function(user, cb) {
     process.nextTick(function() {
       return cb(null, user);
     });
   });

   passport.deserializeUser(function(user, cb) {
     process.nextTick(function() {
       return cb(null, user);
     });
   });
   const LocalStrategy = require('passport-local').Strategy;
   passport.use(new LocalStrategy(User.authenticate()));
   //CORS
   app.use(cors());
   
 //Définition du routeur
   const router = express.Router();
   app.use("/user", router);
   require(__dirname + "/controllers/userController")(router);
  app.use(function(req, res, next) {
     res.header("Access-Control-Allow-Origin", "*");
     res.header("Access-Control-Allow-Credentials",true);
     next();
 });

 app.get('*', (req, res) => {
   res.sendFile(path.join(__dirname, 'client', 'build', 'index.html'))
 });

 app.use("/user", router);
 require(__dirname + "/controllers/userController")(router);

}

//Définition et mise en place du port d'écoute
app.listen(process.env.PORT, '0.0.0.0', () => {
  console.log("Server is running on "+process.env.PORT);
});

controllers/userController.js

const account = require('./account/lib.js');

module.exports = function (app) {
    //LOGIN SIGNUP
    app.post('/login',account.login);
    app.post('/signup',account.signup);
    app.get('/logout', account.logout);

    app.get('/auth/facebook', account.facebook);
    app.get('/facebookToken', account.facebookToken);
    app.get('/auth/facebook/authenticate', account.facebookAuthenticate);

    app.get('/auth/google', account.google);
    app.get('/googleToken', account.googleToken);
    app.get('/auth/google/authenticate', account.googleAuthenticate);

    //SESSION
    app.post('/debutantform',account.debutantform);

    //DASHBOARD
    app.get('/workouts',account.workouts);

    //COMPTE
    app.get('/getUser', account.getUser);

}

controllers/account/lib.js

const User = require("../../schema/schemaUser.js");
const passwordHash = require("password-hash");
const session = require('cookie-session');
const passport = require("passport");
const passportLocalMongoose = require("passport-local-mongoose");
const express = require("express");
const findOrCreate = require('mongoose-findorcreate');
const jwt = require('jsonwebtoken');
require('dotenv').config();

const app = express();

app.use(session({
    secret: process.env.secret,
    resave: false,
    saveUninitialized: false
}));

//PASSPORT
app.use(passport.initialize());
app.use(passport.session());
passport.use(User.createStrategy());
passport.serializeUser((user, done) => {
    done(null, user._id);
});
passport.deserializeUser((_id, done) => {
  User.findById( _id, (err, user) => {
    if(err){
        done(null, false, {error:err});
    } else {
        done(null, user);
    }
  });
});
const LocalStrategy = require('passport-local').Strategy;
passport.use(new LocalStrategy(User.authenticate()));


//FACEBOOK
const FacebookStrategy = require('passport-facebook').Strategy;

let facebookProfile = null;

passport.use(new FacebookStrategy({
    proxy: true,
    clientID: process.env.FACEBOOK_CLIENT_ID,
    clientSecret: process.env.FACEBOOK_CLIENT_SECRET,
    callbackURL: "https://prograrmorprealpha1.herokuapp.com/user/auth/facebook/authenticate",
    profileFields: ['id', 'name', 'email', 'picture.type(large)']
  },
  async (accessToken, refreshToken, profile, done) => {

    facebookProfile = profile._json
    const user = {
        facebookId : profile._json.id,
        email : profile._json.email,
        fName: profile._json.first_name,
        lName: profile._json.last_name,
        profilePic: profile._json.picture.data.url
    }

    try {
      const oldUser = await User.findOne({ facebookId: user.facebookId });

      if (oldUser) {
        return done(oldUser);
      }
    } catch (err) {
      console.log(err);
      return done(false);
    }

    // register user
    try {
      const newUser = await new User(user).save();

      done(null, newUser);
    } catch (err) {
      console.log(err);
      return done(false);
    }
}
))

async function facebook(req, res) {
    passport.authenticate("facebook", {failureRedirect: '/', session: true, scope:['email'], successRedirect: 'https://prograrmorprealpha1.herokuapp.com/dashboard'})(req,res,function(){
                    const token = jwt.sign({ username: 'facebook' }, process.env.secret, { expiresIn: "24h" });
                    res.redirect('https://prograrmorprealpha1.herokuapp.com/dashboard');
                    res.json({ success: true, message: "Register Facebook successful", token: token });
    });
};

async function facebookAuthenticate(req, res) {
    try {
        passport.authenticate("facebook", {failureRedirect: '/', session: true, successRedirect: 'https://prograrmorprealpha1.herokuapp.com/dashboard'})(req,res,function(){
            res.redirect('https://prograrmorprealpha1.herokuapp.com/dashboard');
        });
        }
    catch (error) {
      res.send(error);
    }
};

[
.
.
.
]

async function getUser(req, res) {
    let profile = null;

    console.log("break1");
    console.log(req.user); //returns undefined

    console.log("break2");
    console.log(req.isAuthenticated()); //returns false
}

Front end : client/utils/API.js

import axios from "axios";
const headers = { withCredentials: true };
const burl = "https://prograrmorprealpha1.herokuapp.com";
axios.defaults.withCredentials = true;

export default {

[
.
.
.
]

  getUser: function(){
      return axios.get(`${burl}/user/getUser`, headers);

  }
};

client/src/components/Compte.jsx

import {React, useState, useEffect} from "react";
import { Button } from "react-bootstrap";
import NavigBar from "../NavigBar.jsx"
import API from "../../utils/API";

function Compte() {
    const [user, setUser] = useState({})
    const [formInfo, setFormInfo] = useState({})
    const [modifyInfo, setModifyInfo] = useState(false);

    async function disconnect() {
        await API.logout();
        localStorage.removeItem('token');
        window.location = "/";
    };

    async function getUser(){
        const {data} = await API.getUser();
        if (data.success === false){
            alert(data.message);
        } else {
            console.log(data.profile);
            setUser(data.profile);
        };
    }

  useEffect(() => {
        setTimeout(getUser, 50);
  }, []);

.
.
.

}

内容的提问来源于stack exchange,提问作者Amaury Simondet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:25:19