Passport.js+Google OAuth2.0+Express-Session中req.user为undefined求助
Passport.js + Google OAuth2.0认证后req.user始终为undefined问题
我花费一整天排查问题,无论如何操作,在使用Passport.js结合Google OAuth2.0与Express-Session(可选Valkey存储)完成用户认证后,req.user属性始终为undefined,恳请帮助!
核心问题:用户成功认证后req.user仍为undefined。
我已查阅官方文档及相关教程,但仍未解决该问题。
核心代码文件
App.js
import express from "express"; import helmet from "helmet"; import morgan from "morgan"; import mongoSanitize from "express-mongo-sanitize"; import cors from "cors"; import hpp from "hpp"; import session from "express-session"; import redisStore from "./db/valkey.js"; import auth from "./middlewares/auth.js"; import myPassport from "./services/passport.js"; import userRouter from "./routes/user.routes.js"; const cookieOptions = { httpOnly: true, secure: false, //Change To True In Production Very Important****** //sameSite: "none" //uncomment in prod so it only accept request from one site }; const sessionOptions = { name: "sessionId", //store: redisStore, resave: false, // required: force lightweight session keep alive (touch) saveUninitialized: true, // false recommended: only save session when data exists secret: process.env.SESSION_SECRET, cookie: cookieOptions, maxAge: 1000 * 60 * 60 * 24, } const app = express(); //app.set("trust proxy", 1); //for proxy related issues app.use(helmet()); app.use( cors({ origin: process.env.CORS_ORIGIN, }) ); app.use(express.urlencoded({ extended: true, limit: "16kb" })); app.use(express.static("public")); app.use(session(sessionOptions)); app.use(myPassport.initialize()); app.use(myPassport.session()); app.use(myPassport.authenticate("session")); app.use(morgan("combined")); app.use(express.json({ limit: "16kb" })); app.use(hpp()); app.use(mongoSanitize()); app.use("/api/v1/users", userRouter); app.get("/", (req, res) => res.status(200).json({ Message: "Hi!" })); app.get("/home", auth ,(req, res) => res.status(200).json({ Message: "Successfully Logged In!" }) ); export default app;
Passport.js
import passport from "passport"; import { Strategy as GoogleStrategy } from "passport-google-oauth20"; import { User } from "../models/user.model.js"; const myPassport = new passport.Passport(); myPassport.serializeUser((user, cb)=>{ const data = { id: user.id, displayName: user.displayName, name: user.name, emails: user.emails, photos: user.photos, }; console.log("Got Serialized: ", user); cb(null, data); }); myPassport.deserializeUser((user, cb)=>{ console.log("Got Called: ", user); cb(null, user); }); const AUTH_OPTIONS = { clientID: process.env.GOOGLE_CLIENT_ID, clientSecret: process.env.GOOGLE_CLIENT_SECRET, callbackURL: "http://localhost:3000/api/v1/users/auth/google/callback", scope: ["profile"], session: true, }; async function verifyCallback(accessToken, refreshToken, profile, done) { // console.log(accessToken); // console.log(refreshToken); //console.log("Google Profile: ", profile); try { const existingUser = await User.findOne({email: profile.emails[0].value}); if(existingUser) return done(null, profile); const user = await User.create({name: profile.displayName, email: profile.emails[0].value}); return done(null, profile); } catch (error) { console.error("Error: ", error); return done("Something Went Wrong!", profile); } //Create User Record And If Any Error Pass The Error To Passport Through Callback. //Replace Null With The Error. } myPassport.use(new GoogleStrategy(AUTH_OPTIONS, verifyCallback)); export default myPassport;
Routes.js
import { Router } from "express"; import auth from "../middlewares/auth.js"; import validateDto from "../middlewares/validateDto.middleware.js"; import validate from "../validation/jsonSchema.js"; import myPassport from "../services/passport.js"; import { register, login } from "../controllers/user.controller.js"; const userRouter = Router(); const googleAuth = myPassport.authenticate("google", { scope: ["email", "profile"], }); const googleAuthCallback = myPassport.authenticate("google", { failureRedirect: "/login", successRedirect: "/home", }); userRouter.get("/auth/google", googleAuth); userRouter.get("/auth/google/callback", googleAuthCallback); userRouter.post("/register", register); userRouter.get("/login", login); export default userRouter;
Controller.js
import { User } from "../models/user.model.js"; import asyncHandler from "../utils/asyncHandler.js"; import ApiError from "../utils/ApiError.js"; import ApiResponse from "../utils/ApiResponse.js"; const register = asyncHandler(async (req, res) => { if (req.isAuthenticated()) console.log("rec"); console.log("Test: ", req.session, req.session.user, req.user, req.log, req.local); res.send("OK"); }); const login = asyncHandler(async (req, res) => { console.log(req.user); if (!req.isAuthenticated()) { throw new ApiError(400, "Login Failed Try Again!"); } res.status(302).redirect("/home"); }); export { register, login };
内容的提问来源于stack exchange,提问作者Parag Yadav
相关产品推荐
相关产品推荐

