如何获取当前会话用户信息?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
相关产品推荐
相关产品推荐

