3 글 보임 - 1 에서 3 까지 (총 3 중에서)
-
글쓴이글
-
2024년 11월 13일 15:59 #132288
Leo참가자안녕하세요, 왜 /api/auth/info 에 들어가도 undefined 만 터미널에 출력 되고 빈 회색 창만 뜰까요, 원래 req.user 에는 로그인 정보가 떠야되는걸로 알고 있습니다.
const express = require("express"); const { ObjectId } = require("mongodb"); const app = express(); app.use(express.static(__dirname + "/styles")); app.use(express.static(__dirname + "/views")); app.set("view engine", "ejs"); app.use(express.json()); app.use(express.urlencoded({ extended: true })); const session = require("express-session"); const passport = require("passport"); const LocalStrategy = require("passport-local"); require("dotenv").config(); const bcrypt = require("bcrypt"); const MongoStore = require("connect-mongo"); const uri = process.env.dburl; const { MongoClient, ServerApiVersion } = require("mongodb"); const client = new MongoClient(uri); let db; async function run() { try { await client.connect(); await client.db("admin").command({ ping: 1 }); console.log( "Pinged your deployment. You successfully connected to MongoDB!" ); db = await client.db("forum"); } catch (e) { console.error(e); } } run().catch(console.dir);
app.use(passport.initialize()); app.use( session({ secret: process.env.sessionsecret, resave: false, saveUninitialized: false, store: MongoStore.create({ mongoUrl: uri, dbName: "forum", }), }) );
passport.use( new LocalStrategy(async (userid, userpasswd, cb) => { try { let result = await db.collection("user").findOne({ username: userid }); if (!result) { return cb(null, false, { message: "no_id_in_db" }); }
if (await bcrypt.compare(userpasswd, result.password)) { return cb(null, result); } else { return cb(null, false, { message: "password_not_correct" }); } } catch (error) { return cb(null, false, { message: "서버에러" }); } }) );
passport.serializeUser((user, done) => { process.nextTick(() => { done(null, { id: user._id, username: user.username }); }); });
passport.deserializeUser(async (user, done) => { let result = await db .collection("user") .findOne({ _id: new ObjectId(user.id) }); delete result.password; process.nextTick(() => { return done(null, result); }); });
const printf = console.log;
const PORT = 80; app.listen(PORT, () => { printf(`http://localhost:${PORT} 에서 서버 실행중`); });
app.get("/", (req, res) => { res.render("index.ejs"); });
app.get("/auth", async (req, res) => { res.render("auth.ejs", { query: req.query }); }); app.get("/auth/new", async (req, res) => { res.render("authNew.ejs", { query: req.query }); }); app.post("/api/auth/new/", async (req, res) => { const passwd = req.body.password; const username = req.body.username;
let isokay_id = /^[a-zA-Z0-9]+$/.test(username) && username.length >= 3;
try { const existingUser = await db .collection("user") .findOne({ username: username }); if (existingUser || !isokay_id) { return res.redirect("/auth/new?checkusername=true"); }
const isokay_passwd = passwd.length >= 10 && /[0-9]/.test(passwd) && /[!@#$%^&*(),.?":{}|<>]/.test(passwd);
if (!isokay_passwd) { return res.redirect("/auth/new?checkpassword=true"); }
let hashedpasswd = await bcrypt.hash(passwd, 10); await db.collection("user").insertOne({ username: username, password: hashedpasswd, });
res.redirect("/"); } catch (error) { console.error(error); res.status(500).send("Internal Server Error"); } });
app.post("/api/auth", async (req, res, next) => { passport.authenticate("local", (error, user, info) => { if (error) { return res.status(500).json(error); } if (!user) { if (info.message == "password_not_correct") { return res.redirect("/auth?incorrectPassword=true"); } if (info.message == "no_id_in_db") { return res.redirect("/auth?incorrectUserName=true"); } } req.logIn(user, (err) => { if (err) { return next(err); } res.redirect("/"); }); })(req, res, next); });
app.get("/api/auth/info", (req, res) => { printf(req.user); res.send(req.user); });
app.get("*", (req, res) => { res.status(404).render("notFound.ejs"); });
로그인 하고 바로 /api/auth/info 에 들어갓읍니다.
-
이 게시글은
Leo에 의해 8 월 전에 수정됐습니다. 이유: 그냥
-
이 게시글은
-
글쓴이글
3 글 보임 - 1 에서 3 까지 (총 3 중에서)
- 답변은 로그인 후 가능합니다.