mailbox/backend/routes/auth.js

112 lines
3 KiB
JavaScript
Raw Normal View History

2025-12-16 08:18:15 +09:00
/**
* 인증 라우터
* 로그인 토큰 검증
*/
const express = require("express");
const router = express.Router();
const jwt = require("jsonwebtoken");
const bcrypt = require("bcryptjs");
const { Op } = require("sequelize");
const User = require("../models/User");
const SystemConfig = require("../models/SystemConfig");
const JWT_SECRET =
process.env.JWT_SECRET || "super_secret_jwt_key_changed_in_production";
/**
* 로그인
* POST /api/login
* - 이메일 또는 아이디(@ 없이) 로그인 가능
*/
router.post("/login", async (req, res) => {
let { email, password } = req.body;
try {
// 아이디로 로그인 시도 시 (@ 없이 입력) 전체 이메일 조회
if (!email.includes("@")) {
const user = await User.findOne({
where: { email: { [Op.like]: `${email}@%` } },
});
if (user) email = user.email;
}
const user = await User.findOne({ where: { email } });
if (!user) {
return res.status(401).json({ error: "잘못된 자격 증명입니다." });
}
const isMatch = await bcrypt.compare(password, user.password);
if (!isMatch) {
return res.status(401).json({ error: "잘못된 자격 증명입니다." });
}
// DB에서 세션 만료 시간 조회 (기본값: 24시간)
let expireHours = 24;
try {
const config = await SystemConfig.findByPk("session_expire_hours");
if (config && config.value) {
expireHours = parseInt(config.value) || 24;
}
} catch (e) {
console.error("세션 설정 조회 오류:", e);
}
// JWT 토큰 생성
console.log(`[로그인] ${user.email} - 세션 만료 시간: ${expireHours}시간`);
const token = jwt.sign(
{ id: user.id, email: user.email, isAdmin: user.isAdmin },
JWT_SECRET,
{ expiresIn: `${expireHours}h` }
);
res.json({
success: true,
token,
user: {
id: user.id,
email: user.email,
name: user.name,
isAdmin: user.isAdmin,
},
});
} catch (error) {
console.error("로그인 오류:", error);
res.status(500).json({ error: "서버 내부 오류" });
}
});
/**
* 토큰 검증 최신 사용자 정보 조회
* GET /api/verify
* - 토큰 검증 DB에서 최신 사용자 정보 가져옴
*/
router.get("/verify", async (req, res) => {
const token = req.headers.authorization?.split(" ")[1];
if (!token) return res.status(401).json({ valid: false });
try {
const decoded = jwt.verify(token, JWT_SECRET);
// DB에서 최신 사용자 정보 조회
const user = await User.findByPk(decoded.id);
if (!user) {
return res
.status(401)
.json({ valid: false, error: "사용자를 찾을 수 없습니다" });
}
res.json({
valid: true,
user: {
id: user.id,
email: user.email,
name: user.name,
isAdmin: user.isAdmin,
},
});
} catch (err) {
return res.status(401).json({ valid: false });
}
});
module.exports = router;