Skip to content

Commit

Permalink
[CHORE] commit 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
leGit-y committed Oct 10, 2023
1 parent fc27e3e commit 73b9b84
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 278 deletions.
6 changes: 4 additions & 2 deletions src/controller/authController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,10 @@ const kakaoLogin_getAuthorizedCode = async (req: Request, res: Response, next: N
},
})


const data = await authService.serviceLogin("kakao", response.data);


// 경우에 따라 다른 response message 출력
// - 회원가입한 경우
if(data.isNew){
Expand Down Expand Up @@ -136,6 +138,7 @@ const kakaoLogin_getAuthorizedCode = async (req: Request, res: Response, next: N

}


const appleLogin =async (req: Request, res:Response, next:NextFunction) => {
try {
const { identityToken, user } = req.body
Expand All @@ -157,14 +160,13 @@ const kakaoLogin_getAuthorizedCode = async (req: Request, res: Response, next: N

}




export default{
kakaoLogin_getAuthorizedCode,
kakaoLogin_getToken,
kakaoLogin,
kakaoLogout,
appleLogin,


}
241 changes: 1 addition & 240 deletions src/controller/userController.ts
Original file line number Diff line number Diff line change
@@ -1,215 +1,8 @@
import { NextFunction, Request, Response } from "express";
import { fail, success } from "../constants/response";
import { rm, sc, tokenType } from "../constants";
import { ClientException } from "../common/error/exceptions/customExceptions";
import statusCode from "../constants/statusCode";
import { userService } from "../service";
import { userCreateDTO } from "../interfaces/DTO/userDTO";
import { validationResult } from "express-validator";
import jwtHandler from "../modules/jwtHandler";
import axios from 'axios';
import tokenRepository from "../repository/tokenRepository";
import { JwtPayload } from "jsonwebtoken";
import tokenService from "../service/tokenService";
import qs from "qs";


const kakaoLogin_getAuthorizedCode = async (req: Request, res: Response, next: NextFunction) => {
try{
//인가코드 받기
const baseUrl = "https://kauth.kakao.com/oauth/authorize";
const config = {
client_id: process.env.KAKAO_CLIENT_ID!,
redirect_uri: process.env.KAKAO_REDIRECT_URI!,
response_type: "code",
};
const params = new URLSearchParams(config).toString();

const finalUrl = `${baseUrl}?${params}`;
return res.redirect(finalUrl);

}catch (error) {
next(error);
}

};
const kakaoLogin_getToken = async (req: Request, res: Response, next: NextFunction) => {
try{

if(req.query.error){
throw new ClientException("로그인 실패");
}

//토큰 받기
const response = await axios({
method: 'POST',
url: 'https://kauth.kakao.com/oauth/token',
headers:{
'Content-type': 'application/x-www-form-urlencoded;charset=utf-8'
},
data:qs.stringify({//객체를 string 으로 변환
grant_type: 'authorization_code', //해당 값으로 고정
client_id:process.env.KAKAO_CLIENT_ID,
client_secret:process.env.KAKAO_SECRET_KEY, //보안 강화를 위함 (필수값은 아님)
redirectUri:process.env.KAKAO_REDIRECT_URI,
code:req.query.code, //kakaoLogin_getAuthorizeCode 를 통해 query string 으로 받은 인가 코드
})
})

return res.status(sc.OK).send(success(statusCode.OK, rm.READ_KAKAO_TOKEN_SUCCESS, response.data));

//발급받은 토큰을 사용해서 카카오 유저 정보 가져오기
// const user = await kakaoLogin_getUserKakaoInfo(token);
// if(!user)
// return res.redirect('/kakao/login');

// return await serviceLogin(req,res,next,user);

// // return res.status(sc.OK).send(success(statusCode.OK, rm.KAKAO_LOGIN_SUCCESS, response.data));


} catch (error) {
next(error);
}
}


const kakaoLogin =async (req: Request, res:Response, next:NextFunction) => {
try{
const { accessToken } = req.body;

// get user kakao info
const response = await axios({
method: 'GET',
url: 'https://kapi.kakao.com/v2/user/me',
headers:{
'Authorization': `Bearer ${accessToken}`,
'Content-type': 'application/x-www-form-urlencoded;charset=utf-8'
},
})

// console.log(response.data)
return await serviceLogin(req,res,next,response.data);

}catch(error:any){

//토큰이 유효하지 않은 경우
if(error.response.data.msg == "this access token does not exist"){
return res.status(sc.UNAUTHORIZED).send(fail(sc.UNAUTHORIZED, rm.INVALID_TOKEN));
}
console.log(error)
return res.status(error.response.status).send(fail(error.response.status, error.response.data.msg));

}

}

const kakaoLogout =async (req: Request, res:Response, next:NextFunction) => {
try{
const { accessToken } = req.body;

const response = await axios({
method: 'POST',
url: 'https://kapi.kakao.com/v1/user/logout',
headers:{
'Authorization': `Bearer ${accessToken}`,
}
})

return res.status(sc.OK).send(success(statusCode.OK, rm.KAKAO_LOGOUT_SUCCESS, response.data.msg));

}catch(error:any){

//토큰이 유효하지 않은 경우
if(error.response.data.msg == "this access token does not exist"){
return res.status(sc.UNAUTHORIZED).send(fail(sc.UNAUTHORIZED, rm.INVALID_TOKEN));
}
console.log(error)

return res.status(error.response.status).send(fail(error.response.status, error.response.data.msg));

}

}

// 캐라 서비스의 로그인 함수
const serviceLogin = async (req: Request, res:Response,next:NextFunction, user:any) => {
try{
const { id, kakao_account } = user;

let isNew = false
let foundUser = await userService.getUserByKakaoId(id);

//가입하지 않은 회원일 경우, 회원가입 진행
if(!foundUser){
//필수 동의만 했을 경우
req.body = {
"kakaoId": id,
"name": kakao_account.profile.nickname,
}
//선택 동의도 했을 경우
if(kakao_account.email)
req.body.email = kakao_account.email
if(kakao_account.age_range)
req.body.ageRange = kakao_account.age_range
if(kakao_account.gender)
req.body.gender = kakao_account.gender

const createdUser = await userService.createUser(req.body);
foundUser = createdUser
isNew = true
}


//local accessToken, refreshToken 발급
const accessToken = jwtHandler.access(foundUser.id);
const refreshToken = jwtHandler.refresh();

const result = {
id: foundUser.id,
name: foundUser.name,
accessToken,
refreshToken
};

// 발급받은 refresh token 은 DB에 저장
const data = await tokenRepository.findRefreshTokenById(foundUser.id);
if(!data){
await tokenRepository.createRefreshToken(foundUser.id, refreshToken);
}
await tokenRepository.updateRefreshTokenById(foundUser.id,refreshToken);



// 경우에 따라 다른 response message 출력
// - 회원가입한 경우
if(isNew){
return res.status(sc.OK).send(success(sc.OK, rm.SIGNUP_SUCCESS, result));
}

// - 기존회원이 로그인한 경우
return res.status(sc.OK).send(success(sc.OK, rm.LOGIN_SUCCESS, result));

}catch(error){
next(error)
}

}

const serviceLogout = async (req: Request, res: Response, next: NextFunction) => {
try{
const { accessToken } = req.body


// await tokenRepository.updateRefreshTokenById(accessToken, refreshToken);

}catch(error){
next(error)
}



}
import statusCode from "../constants/statusCode";

const getUserById = async (req: Request, res: Response, next: NextFunction) => {
try {
Expand All @@ -227,38 +20,6 @@ const getUserById = async (req: Request, res: Response, next: NextFunction) => {
}
};

const refreshToken = async (req: Request, res: Response, next: NextFunction) => {
try{
const { accessToken, refreshToken} = req.body;
const access_decoded = jwtHandler.accessVerify(accessToken);
const refresh_decoded = jwtHandler.refreshVerify(refreshToken);

// 잘못된 accessToken or refreshToken 일 경우
if ((access_decoded === tokenType.ACCESS_TOKEN_INVALID) || (refresh_decoded === tokenType.REFRESH_TOKEN_INVALID))
return res.status(sc.BAD_REQUEST).send(fail(sc.BAD_REQUEST, rm.INVALID_TOKEN));

// 기간이 만료된 경우 -> refreshToken을 이용하여 재발급
if (access_decoded === tokenType.ACCESS_TOKEN_EXPIRED){
// refresh token도 만료된 경우 (access,refresh 모두 만료)
if (refresh_decoded === tokenType.REFRESH_TOKEN_EXPIRED)
return res.status(sc.UNAUTHORIZED).send(fail(sc.UNAUTHORIZED, rm.EXPIRED_ALL_TOKEN));

const new_access_token = await tokenService.refreshAccessToken(refreshToken);
return res.status(sc.OK).send(success(statusCode.OK, rm.REFRESH_TOKEN_SUCCESS, new_access_token));

}

const data = {
"accessToken": accessToken
}

return res.status(sc.OK).send(success(statusCode.OK, "유효한 토큰입니다. 재발급이 불필요합니다.",data));

}catch(error){
next(error)
}

}


export default{
Expand Down
2 changes: 2 additions & 0 deletions src/router/authRouter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ router.post("/kakao/logout",
authController.kakaoLogout
)


router.post("/apple/login",
[
body('identityToken').notEmpty().withMessage("body 에 'identityToken' 값이 존재하지 않습니다"),
Expand All @@ -38,6 +39,7 @@ router.post("/apple/login",
authController.appleLogin
)


router.post("/token/refresh",
[
body('accessToken').notEmpty().withMessage("body 에 'accessToken' 값이 존재하지 않습니다"),
Expand Down
1 change: 0 additions & 1 deletion src/router/userRouter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import validate from "../middlewares/validate";
const router = Router();



router.get("/:userId",
auth,
userController.getUserById
Expand Down
Loading

0 comments on commit 73b9b84

Please sign in to comment.