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