From 90f74cecfb2855e759158461d46d321f2d56ee22 Mon Sep 17 00:00:00 2001 From: hyejungg Date: Sat, 4 Jan 2025 00:13:48 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8,=20=EC=9E=AC?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8,=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EC=8B=9C=20osType=EC=9D=84=20db=EC=97=90=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/authController.js | 2 ++ src/middleware/auth.js | 20 +++++++++++++++++-- src/models/user.js | 32 ++++++++++++++++++++++++++++--- src/routes/authRoutes.js | 8 ++++---- src/utils/response.js | 4 ++++ src/utils/strings.js | 7 +++++++ 6 files changed, 64 insertions(+), 9 deletions(-) diff --git a/src/controllers/authController.js b/src/controllers/authController.js index d24d102..c1085e9 100644 --- a/src/controllers/authController.js +++ b/src/controllers/authController.js @@ -57,6 +57,8 @@ module.exports = { throw new BadRequest(ErrorMessage.BadRequestMeg); } + console.log(req.osType); + const isExist = await User.validateEmail(req); if (!isExist) { await User.signUp(req).then(async (userId) => { diff --git a/src/middleware/auth.js b/src/middleware/auth.js index 514ec43..bae074e 100644 --- a/src/middleware/auth.js +++ b/src/middleware/auth.js @@ -1,6 +1,7 @@ const jwt = require('jsonwebtoken'); const { ErrorMessage } = require('../utils/response'); -const { Unauthorized } = require('../utils/errors'); +const { Unauthorized, BadRequest } = require('../utils/errors'); +const { OsType } = require('../utils/strings'); require('dotenv').config({ path: '../.env' }); const jwtSecret = process.env.JWT_SECRET_KEY; @@ -20,4 +21,19 @@ const verifyToken = (req, res, next) => { } }; -module.exports = { verifyToken }; +const getOsType = (req, res, next) => { + const userAgent = req.headers['user-agent']; + if (!userAgent) { + throw new BadRequest(ErrorMessage.userAgentNotFound); + } + const osType = userAgent.split('/')[0].split('-')[1]; + const osTypeToUpperCase = String(osType).toUpperCase(); + + if (!Object.keys(OsType).includes(osTypeToUpperCase)) { + throw new BadRequest(ErrorMessage.userAgentInOsInfoNotFound); + } + req.osType = String(osType).toUpperCase(); + return next(); +}; + +module.exports = { verifyToken, getOsType }; diff --git a/src/models/user.js b/src/models/user.js index ec80d5b..8468461 100644 --- a/src/models/user.js +++ b/src/models/user.js @@ -1,5 +1,5 @@ const bcrypt = require('bcryptjs'); -const { NotFound, Conflict } = require('../utils/errors'); +const { NotFound, Conflict, BadRequest } = require('../utils/errors'); const { ErrorMessage } = require('../utils/response'); const db = require('../config/db'); const { trimToString } = require('../utils/util'); @@ -10,6 +10,7 @@ module.exports = { const email = req.body.email; const password = req.body.password; const fcmToken = req.body.fcmToken; + const osType = req.osType; const hashPassword = bcrypt.hashSync(password, 10); @@ -29,8 +30,8 @@ module.exports = { } const sqlInsert = - 'INSERT IGNORE INTO users (email, password, fcm_token) VALUES (?, ?, ?)'; - const params = [email, hashPassword, fcmToken]; + 'INSERT IGNORE INTO users (email, password, fcm_token, os_type) VALUES (?, ?, ?, ?)'; + const params = [email, hashPassword, fcmToken, osType]; const [rows] = await db.queryWithTransaction(sqlInsert, params); @@ -43,6 +44,7 @@ module.exports = { const email = req.body.email; const password = req.body.password; const fcmToken = req.body.fcmToken; + const osType = req.osType; const sqlSelect = 'SELECT user_id, email, nickname, fcm_token, password, is_active FROM users WHERE email = ?'; @@ -53,6 +55,9 @@ module.exports = { } const checkPassword = bcrypt.compareSync(password, selectRows[0].password); + if (!checkPassword) { + throw new BadRequest(ErrorMessage.signInPasswordNotCorrect); + } // fcm 토큰이 다른 유저에 존재한다면, 다른 유저를 null 처리 const sqlSelectByFcmToken = @@ -85,6 +90,16 @@ module.exports = { } } + // osType 저장 + const sqlUpdate = 'UPDATE users SET os_type = ? WHERE user_id = ?'; + const params = [osType, selectRows[0].user_id]; + + const [updateRows] = await db.queryWithTransaction(sqlUpdate, params); + + if (updateRows.affectedRows < 1) { + throw new NotFound(ErrorMessage.failedUpdateFcmToken); + } + return { result: checkPassword, userId: selectRows[0].user_id, @@ -94,6 +109,7 @@ module.exports = { restartSignIn: async function (req) { const email = req.body.email; const fcmToken = req.body.fcmToken; + const osType = req.osType; const sqlSelect = 'SELECT user_id, email, nickname FROM users WHERE email = ? AND is_active = true'; @@ -115,6 +131,16 @@ module.exports = { } } + // osType 저장 + const sqlUpdate = 'UPDATE users SET os_type = ? WHERE user_id = ?'; + const params = [osType, rows[0].user_id]; + + const [updateRows] = await db.queryWithTransaction(sqlUpdate, params); + + if (updateRows.affectedRows < 1) { + throw new NotFound(ErrorMessage.failedUpdateFcmToken); + } + return Object.setPrototypeOf(rows, []); }, selectUser: async function (userId) { diff --git a/src/routes/authRoutes.js b/src/routes/authRoutes.js index ff8890f..88857a9 100644 --- a/src/routes/authRoutes.js +++ b/src/routes/authRoutes.js @@ -1,14 +1,14 @@ const authController = require('../controllers/authController'); -const { verifyToken } = require('../middleware/auth'); +const { verifyToken, getOsType } = require('../middleware/auth'); const express = require('express'); const router = new express.Router(); -router.post('/signin', authController.signIn); -router.post('/signup', authController.signUp); +router.post('/signin', getOsType, authController.signIn); +router.post('/signup', getOsType, authController.signUp); router.post('/logout', verifyToken, authController.logout); router.post('/check-email', authController.checkEmail); router.post('/password-mail', authController.sendMail); -router.post('/re-signin', authController.restartSignIn); +router.post('/re-signin', getOsType, authController.restartSignIn); router.post('/refresh', authController.refreshToken); module.exports = router; diff --git a/src/utils/response.js b/src/utils/response.js index 308e53f..1312cc8 100644 --- a/src/utils/response.js +++ b/src/utils/response.js @@ -116,6 +116,7 @@ const ErrorMessage = { unActvieUserDelete: '매주 월요일 자정, 탈퇴 유저 삭제 실패', unActiveUser: '탈퇴 처리된 유저', + signInPasswordNotCorrect: '입력하신 비밀번호가 올바르지 않음', signUpFailed: 'wishboard 앱 회원가입 실패', existsUserFcmToken: '이미 존재하는 사용자의 fcmToken', validateEmail: '이미 존재하는 이메일 주소', @@ -134,6 +135,9 @@ const ErrorMessage = { failedCreateToken: 'token 생성 실패', userIdNotFound: '토큰을 생성하기 위한 userId data 없음', + userAgentNotFound: 'User-Agent가 없음', + userAgentInOsInfoNotFound: 'User-Agent에 OS정보가 없음', + /* 버전 */ versionInfoNotFound: '버전 정보 없음', versionUpdatedFailed: '버전 정보 수정 실패', diff --git a/src/utils/strings.js b/src/utils/strings.js index a37e1ae..bbbb2ac 100644 --- a/src/utils/strings.js +++ b/src/utils/strings.js @@ -10,7 +10,14 @@ const ItemAddType = { MANUAL: 'MANUAL', }; +const OsType = { + IOS: 'IOS', + AOS: 'AOS', + SERVER: 'SERVER', +}; + module.exports = { Strings, ItemAddType, + OsType, };