- MongoDB가 아닌 MySQL에 사용자 데이터를 저장하도록
- 이메일과 닉네임 중복 확인하는 코드도 제대로 동작하는지 확인
- 사용자 모델 불러오기 예시
const { User } = require("./models");
=> 원래는 "./models/user.js" 였음.
// app.js
const { Op } = require("sequelize");
const { User } = require("./models");
router.post("/users", async (req, res) => {
const { email, nickname, password, confirmPassword } = req.body;
if (password !== confirmPassword) {
res.status(400).send({
errorMessage: "패스워드가 패스워드 확인란과 다릅니다.",
});
return;
}
// email or nickname이 동일한게 이미 있는지 확인하기 위해 가져온다.
const existsUsers = await User.findAll({
where: {
[Op.or]: [{ email }, { nickname }],
},
});
if (existsUsers.length) {
res.status(400).send({
errorMessage: "이메일 또는 닉네임이 이미 사용중입니다.",
});
return;
}
await User.create({ email, nickname, password });
res.status(201).send({});
});
사용자 정보를 데이터베이스에서 가져오는 부분만 수정
// app.js
router.post("/auth", async (req, res) => {
const { email, password } = req.body;
const user = await User.findOne({
where: {
email,
},
});
// NOTE: 인증 메세지는 자세히 설명하지 않는것을 원칙으로 한다: https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html#authentication-responses
if (!user || password !== user.password) {
res.status(400).send({
errorMessage: "이메일 또는 패스워드가 틀렸습니다.",
});
return;
}
res.send({
token: jwt.sign({ userId: user.userId }, "customized-secret-key"),
});
});
userId
를 가지고 데이터베이스에서 사용자 정보를 불러오도록 해야겠죠?
공식 문서를 참고해보니findByPk
를 사용하면 적당해보이네요!
// middlewares/auth-middleware.js
const jwt = require("jsonwebtoken");
const { User } = require("../models");
module.exports = (req, res, next) => {
const { authorization } = req.headers;
const [authType, authToken] = (authorization || "").split(" ");
if (!authToken || authType !== "Bearer") {
res.status(401).send({
errorMessage: "로그인 후 이용 가능한 기능입니다.",
});
return;
}
try {
//복호화 및 검증(findByPk사용)
const { userId } = jwt.verify(authToken, "customized-secret-key");
User.findByPk(userId).then((user) => {
res.locals.user = user;
next();
});
} catch (err) {
res.status(401).send({
errorMessage: "로그인 후 이용 가능한 기능입니다.",
});
}
};
mongoose 코드도 전부 제거