Login / Bcrypt Compare개발/Node.js2024. 11. 8. 11:34
Table of Contents
1. Login
// userController.js
export const postJoin = async (req, res) => {
const { email, username, password1, password2, name, location } = req.body;
if (password1 !== password2) {
return res.status(400).render("join", {
pageTitle: "Join",
errorMessage: "Password confirmation does not match.",
});
}
const exists = await User.exists({ $or: [{ username }, { email }] });
if (exists) {
return res.status(400).render("join", {
pageTitle: "Join",
errorMessage: "This username/email is already taken.",
});
}
try {
await User.create({
email,
username,
password: password2,
name,
location,
});
return res.redirect("login");
} catch (error) {
return res.status(400).render("join", {
pageTitle: "Error join",
errorMessage: error._message,
});
}
};
- 시작하기 전에, 회원가입 할 때 오류가 발생할 수 있으므로 try catch를 사용하여 처리
- 유저가 로그인을 시도하면, account가 존재하는지 확인하고, account의 비밀번호가 맞는지 확인해야하는 흐름
- POST method 필요
export const postLogin = async (req, res) => {
// check if account exists
const { username, password } = req.body;
const exists = await User.exists({ username });
if (!exists) {
return res
.status(400)
.render("login", {
pageTitle: "Login",
errorMessage: "An account with this username does not exists.",
});
}
- username을 통해 account가 있는지 확인은 했지만, password는 hash화 된 값만 알고 있음
- input으로 받은 password를 바로 해싱하여 저장된 account의 해싱된 password와 비교하면 됨
- bcrypt에 내장되어 있는 compare를 사용
2. Bcrypt Compare
- https://www.npmjs.com/package/bcrypt?activeTab=readme#with-promises
const exists = await User.exists({ username });
if (!exists) {
return res.status(400).render("login", {
pageTitle: "Login",
errorMessage: "An account with this username does not exists.",
});
}
// check if password correct
const user = await User.findOne({ username });
- password를 찾기 위해 account가 있는지 확인하기 위해 exists와 fineOne을 썼는데 중복해서 사용
- 굳이 같은 행동을 반복할 필요 없으므로 findOne로 한번만 찾음
export const postLogin = async (req, res) => {
const pageTitle = "Login";
const { username, password } = req.body;
// check if account exists
const user = await User.findOne({ username });
if (!user) {
return res.status(400).render("login", {
pageTitle,
errorMessage: "An account with this username does not exists.",
});
}
// check if password correct
const ok = await bcrypt.compare(password, user.password);
if (!ok) {
return res.status(400).render("login", {
pageTitle,
errorMessage: "Wrong Password",
});
}
return res.redirect("/");
};
'개발 > Node.js' 카테고리의 다른 글
MongoStore resave saveUninitialized (0) | 2024.11.12 |
---|---|
Cookie Session / Express-Session / Locals (0) | 2024.11.08 |
Status Code (0) | 2024.11.08 |
User Authentication / Hash (0) | 2024.11.07 |
User Model (0) | 2024.11.07 |