1. ํ์ํ ๋ชจ๋ ์ค์น
npm install express passport passport-local express-session mongoose
- passport, passport-local : ํ์๊ฐ์ ๊ณผ ๋ก๊ทธ์ธ ์ธ์ ๊ด๋ฆฌ๋ฅผ ๋์์ฃผ๋ ๋ชจ๋
- express-session : ์ธ์ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ชจ๋
2. app.js ๊ธฐ๋ณธ ์ธํ
const express = require("express");
const app = express();
const passport = require("passport");
var Strategy = require("passport-local");
const session = require("express-session");
const mongoose = require("mongoose");
const User = require("./models/user");
// DB ์ฐ๊ฒฐ
mongoose
.connect("mongodb+srv://<username>:<password>@cluster0.p1xn6.mongodb.net/test")
.then(async () => {
console.log("DB ์ฐ๊ฒฐ ์ฑ๊ณต");
})
.catch((e) => {
console.log("DB ์ฐ๊ฒฐ ์คํจ");
});
// POST ์์ฒญ ์ Body๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ์ฝ๋
app.use(
express.urlencoded({
extended: true,
})
);
// passport ๋ชจ๋์ ์ฌ์ฉํ๊ธฐ ์ํ ๊ธฐ๋ณธ ์ธํ
์ฝ๋๋ค
app.use(express.json());
app.use(
session({
secret: "secret",
resave: true,
saveUninitialized: true,
})
);
app.use(passport.initialize());
app.use(passport.session());
app.listen(3000, () => {
console.log("3000 port listen");
});
3. Schema์ Model ์์ฑ (models/user.js)
const mongoose = require("mongoose");
const userSchema = new mongoose.Schema({
username: { type: String, unique: true, required: true },
password: { type: String, required: true },
});
module.exports = mongoose.model("User", userSchema);
4. passport ์ธ์ฆ ์ ๋ต, serializeUser, deserializeUser ์์ฑ
passport.use( // ์ด๋ค strategy๋ฅผ ์ธ์ง, ๊ทธ strategy๋ ์ด๋ป๊ฒ ์ธ์ฆ์ ์ฒ๋ฆฌํ ์ง ์ ์
new Strategy(function (username, password, done) {
User.findOne({ username: username }, function (err, user) {
//DB ์ฐ๊ฒฐ ์คํจ ๋ฑ์ ์๋ฌ
if (err) {
return done(err);
}
//username ์์ฒด๊ฐ DB์ ์์ ๋
if (!user) {
return done(null, false, { message: "Incorrect username." });
}
//username์ ๋ง์ง๋ง ๋น๋ฐ๋ฒํธ๊ฐ ํ๋ฆด ๋
if (user.password !== password) {
// !user.validPassword(password)
return done(null, false, { message: "Incorrect password." });
}
//์ธ์ฆ ์ฑ๊ณต
console.log("success");
return done(null, user);
});
})
);
passport.serializeUser((user, done) => { // ๋ก๊ทธ์ธ ์ฑ๊ณต ์ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ Session์ ์ ์ฅ
done(null, user);
});
passport.deserializeUser((id, done) => {
// ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ์ ์งํ๋ ์ญํ
// ์ธ์ฆ ํ ํ์ด์ง ์ ๊ทผํ ๋ ๋ง๋ค ์ฌ์ฉ์ ์ ๋ณด๋ฅผ Session์์ ์ฝ์ด์จ๋ค.
User.findById(id, (err, user) => {
done(err, user);
});
});
5. router ์์ฑ
5-1. index.js
const express = require("express");
const router = express.Router();
router.get("/", (req, res) => {
console.log(req.user);
if (req.user) { // ์ธ์ฆ๋ ์ ์ ๊ฐ ์์ ๊ฒฝ์ฐ
res.send(`
<h1>ํ์ํฉ๋๋ค ${req.user.username}๋!</h1>
<p><button><a href="/logout">๋ก๊ทธ์์</a></button></p>
`);
} else { // ๊ทธ ์ธ
res.redirect("/login");
}
});
module.exports = router;
5-2. join.js
const express = require("express");
const User = require("../models/user");
const router = express.Router();
const bcrypt = require("bcryptjs");
router.get("/", (req, res) => {
res.send(`
<h1>ํ์๊ฐ์
</h1>
<form action="/join" method="POST">
<div>
<label>Username:</label>
<input type="text" name="username"/>
</div>
<div>
<label>Password:</label>
<input type="password" name="password"/>
</div>
<div>
<input type="submit" value="ํ์๊ฐ์
"/>
</div>
</form>
`);
});
router.post("/", async (req, res) => {
const { username, password } = req.body;
try {
const findData = await User.findOne({ username });
if (findData) { // ์ด๋ฏธ ์กด์ฌํ๋ ์ ์ ์ธ ๊ฒฝ์ฐ
return res.status(400).json({ errors: [{ msg: "User already exists" }] });
}
newUser = new User({
username,
password,
});
await newUser.save(); // DB์ ์ ์ฅ
res.send(`
<h1>ํ์๊ฐ์
์ฑ๊ณต!</h1>
<button><a href='/login'>๋ก๊ทธ์ธ ํ๋ฌ๊ฐ๊ธฐ</a></button>
`);
} catch (err) { // ์๋ฒ ์๋ฌ
console.error(err.message);
res.status(500).send("Server Error");
}
});
module.exports = router;
5-3. login.js
const express = require("express");
const router = express.Router();
const passport = require("passport");
const bcrypt = require("bcryptjs");
router.get("/", (req, res) => {
res.send(`
<h1>๋ก๊ทธ์ธ</h1>
<form action="/login" method="POST">
<div>
<label>Username:</label>
<input type="text" name="username"/>
</div>
<div>
<label>Password:</label>
<input type="password" name="password"/>
</div>
<br />
<div>
<input type="submit" value="๋ก๊ทธ์ธ"/>
</div>
</form>
<button><a href='/join'>ํ์๊ฐ์
</a></button>
`);
});
router.post( // ์์ ์์ฑํ strategy๋ฅผ ํตํด ์ธ์ฆ์ ์ฑ๊ณต/์คํจ ์ฌ๋ถ์ ๋ฐ๋ผ redirectํ ๊ฒฝ๋ก ์ง์
"/",
passport.authenticate("local", {
failureRedirect: "/login",
failureMessage: true,
}),
function (req, res) {
res.redirect("/");
}
);
module.exports = router;
5-4. logout.js
const express = require("express");
const router = express.Router();
const session = require("express-session");
router.get("/", (req, res) => {
req.logout();
req.session.destroy(); // ๋ก๊ทธ์์ ํ ์ธ์
์ญ์
res.redirect("/");
});
module.exports = router;
6. Router ์ฐ๊ฒฐ
const express = require("express");
const app = express();
const passport = require("passport");
var Strategy = require("passport-local");
const session = require("express-session");
const mongoose = require("mongoose");
const User = require("./models/user");
const indexRouter = require("./routes/index");
const loginRouter = require("./routes/login");
const joinRouter = require("./routes/join");
const logoutRouter = require("./routes/logout");
mongoose
.connect("mongodb+srv://admin:1234@cluster0.p1xn6.mongodb.net/test")
.then(async () => {
console.log("DB ์ฐ๊ฒฐ ์ฑ๊ณต");
})
.catch((e) => {
console.log("DB ์ฐ๊ฒฐ ์คํจ");
});
app.use(
express.urlencoded({
extended: true,
})
);
app.use(express.json());
app.use(
session({
secret: "secret",
resave: true,
saveUninitialized: true,
})
);
app.use(passport.initialize());
app.use(passport.session());
app.use("/", indexRouter);
app.use("/login", loginRouter);
app.use("/join", joinRouter);
app.use("/logout", logoutRouter);
passport.use(
new Strategy(function (username, password, done) {
User.findOne({ username: username }, function (err, user) {
//DB ์ฐ๊ฒฐ ์คํจ ๋ฑ์ ์๋ฌ
if (err) {
return done(err);
}
//username ์์ฒด๊ฐ DB์ ์์ ๋
if (!user) {
return done(null, false, { message: "Incorrect username." });
}
//username์ ๋ง์ง๋ง ๋น๋ฐ๋ฒํธ๊ฐ ํ๋ฆด ๋
if (user.password !== password) {
// !user.validPassword(password)
return done(null, false, { message: "Incorrect password." });
}
//์ธ์ฆ ์ฑ๊ณต
console.log("success");
return done(null, user);
});
})
);
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => {
done(err, user);
});
});
app.listen(3000, () => {
console.log("3000 port listen");
});
7. ๋์ ํ์ธ
7-1. ์ด๊ธฐ ํ๋ฉด
์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ํ์ง ์์์ผ๋ฏ๋ก, '/login' ํ์ด์ง๋ก redirect ๋๋ค.
7-2. ํ์๊ฐ์
7-3. ๋ก๊ทธ์ธ
if (req.user) ์กฐ๊ฑด์ ์ํด ์ธ์ฆ๋ ์ ์ ์ ํ๋ฉด ์์ฑ
7-4. ๋ก๊ทธ์์
'elice > study' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CS] AJAX (0) | 2022.02.28 |
---|---|
[BE] REST API (0) | 2022.02.21 |
[BE] ๋ผ์ฐํ (Routing) (0) | 2022.02.14 |
[CS] ์๋งจํฑ ๋งํฌ์ (0) | 2022.02.14 |
[CS] script, script async, script defer (0) | 2022.02.14 |