From 4121fb566edea2df9ba1ab91051a8054916aa538 Mon Sep 17 00:00:00 2001
From: donghyun <ilovekdh1208@ajou.ac.kr>
Date: Thu, 16 Nov 2023 12:20:40 +0900
Subject: [PATCH] feat: refreshToken logic and make db query

---
 src/common/database/index.js         |  4 ++--
 src/common/jwt/jwt.controller.js     | 22 +++++++++++++++-------
 src/common/jwt/jwt.service.js        | 14 +++++++++++++-
 src/modules/auth/auth.controller.js  | 23 +++++++++++++++++------
 src/modules/auth/utils/validation.js |  5 ++---
 5 files changed, 49 insertions(+), 19 deletions(-)

diff --git a/src/common/database/index.js b/src/common/database/index.js
index 198d276..3fb3ca1 100644
--- a/src/common/database/index.js
+++ b/src/common/database/index.js
@@ -2,10 +2,10 @@ const mysql = require("mysql2");
 
 const connection = mysql.createConnection({
   host: "127.0.0.1",
-  port: 3000,
+  port: 3306,
   user: "root",
   password: "1234",
-  database: "cakaatalk",
+  database: "cakaotalk",
 });
 
 connection.connect((err) => {
diff --git a/src/common/jwt/jwt.controller.js b/src/common/jwt/jwt.controller.js
index 8239173..9ec7a58 100644
--- a/src/common/jwt/jwt.controller.js
+++ b/src/common/jwt/jwt.controller.js
@@ -1,5 +1,4 @@
 const jwt = require('jsonwebtoken')
-const AuthToken = require('../../modules/auth/AuthToekn.js')
 const jwtService = require('./jwt.service.js')
 const ACCESS_SECRET_KEY = process.env.ACCESS_TOKEN_PRIVATE_KEY;
 const REFRESH_SECRET_KEY = process.env.REFRESH_TOKEN_PRIVTATE_KEY;
@@ -32,10 +31,11 @@ exports.generateRefreshToken = (email) => {
     )
 }
 
-exports.generateTokens = async (user) => {
+exports.generateTokens = async (email) => {
     try {
-        const accessToken = this.generateAccessToken(user.email);
-        const refreshToken = this.generateRefreshToken(user.email);
+        const accessToken = this.generateAccessToken(email);
+        const refreshToken = this.generateRefreshToken(email);
+        const result = await jwtService.insertRefreshToken(email, refreshToken);
 
         // DB에서 Token 있는지 검사
         const existRefreshToken = await jwtService.checkRefreshToken(refreshToken);
@@ -47,11 +47,19 @@ exports.generateTokens = async (user) => {
     }
 };
 
-exports.validateToken = (accessToken, refreshToken) => {
-
+exports.validateToken = async (accessToken, refreshToken) => {
+    return new Promise(async (resolve, reject) => {
+        try {
+            const email = await verifyAccessToken(accessToken, refreshToken);
+            resolve(email);
+        } catch (err) {
+            console.err("Authentication 실패");
+            reject(err);
+        }
+    })
 }
 
-function verifyAccessToken(accessToken) {
+function verifyAccessToken(accessToken, refreshToken) {
     return new Promise((resolve, reject) => {
         try {
             resolve(jwt.verify(accessToken, ACCESS_SECRET_KEY));
diff --git a/src/common/jwt/jwt.service.js b/src/common/jwt/jwt.service.js
index a6aeb2e..04d27a5 100644
--- a/src/common/jwt/jwt.service.js
+++ b/src/common/jwt/jwt.service.js
@@ -17,10 +17,22 @@ exports.checkRefreshToken = (refreshToken) => {
     });
 }
 
+exports.insertRefreshToken = (email, refreshToken) => {
+    return new Promise((resolve, reject) => {
+        mysql.query('INSERT INTO AUTH (email, refresh_token) VALUES (?, ?);', [email, refreshToken], (err, results) => {
+            if (err) {
+                reject(err);
+            } else {
+                resolve(results);
+            }
+        });
+    });
+}
+
 // RefreshToken 삭제 함수
 exports.deleteRefreshToken = (refreshToken) => {
     return new Promise((resolve, reject) => {
-        connection.query('DELETE FROM AUTH WHERE refresh_token = ?', [refreshToken], (err, results) => {
+        mysql.query('DELETE FROM AUTH WHERE refresh_token = ?', [refreshToken], (err, results) => {
             if (err) {
                 reject(err);
             } else {
diff --git a/src/modules/auth/auth.controller.js b/src/modules/auth/auth.controller.js
index f2c2904..f2fcc04 100644
--- a/src/modules/auth/auth.controller.js
+++ b/src/modules/auth/auth.controller.js
@@ -4,15 +4,22 @@ const userService = require('../user/user.service');
 exports.signUpAndGiveToken = async (req, res) => {
     try {
         const { email, password } = req.body;
-
+        const result = await userService.findUserByEmail(email);
+        if (result != undefined || result != null) {
+            throw new Error("Already Existing Email");
+        }
+    } catch (error) {
+        console.error(error);
     }
 }
 
 exports.loginAndGiveToken = async (req, res) => {
     try {
         const email = req.query.email;
+        console.log(email);
         const result = await userService.findUserByEmail(email);
-        const accessToken = jwtController.generateAccessToken(result[0].email);
+        const { accessToken, refreshToken } = await jwtController.generateTokens(result[0].email);
+        res.cookie('refreshToken', refreshToken, { httpOnly: true });
         res.status(200).json({ accessToken: accessToken });
     } catch (error) {
         console.error('Error occurred while finding user by email:', error);
@@ -33,20 +40,24 @@ exports.logoutAndDestroyToken = async (req, res) => {
 // TODO: next 넣어서 미들웨어로 만들기
 exports.checkUserSession = async (req, res) => {
     try {
-        const accessToken = req.headers.authorization;
+        const accessToken = req.headers.Authorization;
         const refreshToken = extractRefreshTokenFromCookie(req);
+        console.log("refreshToken: " + refreshToken);
         const result = await jwtController.validateToken(accessToken, refreshToken);
         console.log('Successfuly Authenticateed');
         res.status(200).json({ email: result.email });
     } catch (error) {
-        res.status(500).json({ error: error })
+        res.status(500).json("토큰 없음");
     }
 }
 
 // Http Only Cookie에서 RefreshToken을 가져오는 함수
 function extractRefreshTokenFromCookie(req) {
     // TODO: Http Only Cookie에서 RefreshToken을 가져오는 로직을 작성해주세요.
-    // 쿠키에서 RefreshToken을 추출하고 반환해야 합니다.
-    return req.cookies.refreshToken;
+    const refreshToken = req.cookies.refreshToken
+    if (refreshToken) {
+        return req.cookies.refreshToken;
+    }
+    throw new Error("Refresh Token이 Cookie에 존재하지 않음");
 }
 
diff --git a/src/modules/auth/utils/validation.js b/src/modules/auth/utils/validation.js
index 1617b10..0732745 100644
--- a/src/modules/auth/utils/validation.js
+++ b/src/modules/auth/utils/validation.js
@@ -1,6 +1,5 @@
 const signUpBodyValidation = (email, body) => {
     return new Promise((resolve, reject) => {
-
-    }
-    )
+        
+    });
 };
\ No newline at end of file
-- 
GitLab