11import { Controller , Get , UseGuards , Req , Res , Post } from '@nestjs/common' ;
22import { AuthGuard } from '@nestjs/passport' ;
33import { AuthService } from './auth.service' ;
4- import { JwtService } from '@nestjs/jwt' ;
54import { JwtAuthGuard } from './guards/jwt-auth.guard' ;
65import { Response } from 'express' ;
6+ import { MessageResponseDto } from './dtos/messageResponse.dto' ;
7+ import { ApiOperation , ApiResponse } from '@nestjs/swagger' ;
8+ import { TokenService } from './token/token.service' ;
79
8- const HOUR = 60 * 60 * 1000 ;
9- const WEEK = 7 * 24 * 60 * 60 * 1000 ;
10+ export enum AuthResponseMessage {
11+ AUTH_LOGGED_OUT = '로그아웃하였습니다.' ,
12+ }
1013
1114@Controller ( 'auth' )
1215export class AuthController {
1316 constructor (
1417 private readonly authService : AuthService ,
15- private readonly jwtService : JwtService ,
18+ private readonly tokenService : TokenService ,
1619 ) { }
1720
1821 @Get ( 'naver' )
@@ -27,17 +30,17 @@ export class AuthController {
2730 async naverCallback ( @Req ( ) req , @Res ( ) res : Response ) {
2831 // 네이버 인증 후 사용자 정보 반환
2932 const user = req . user ;
30- // TODO: 후에 권한 (workspace 조회, 편집 기능)도 payload에 추가
31- const payload = { sub : user . id , provider : user . provider } ;
32- const accessToken = this . jwtService . sign ( payload , { expiresIn : '1h' } ) ;
33- const refreshToken = this . jwtService . sign ( payload , { expiresIn : '7d' } ) ;
33+
34+ // primary Key인 id 포함 payload 생성함
35+ // TODO: 여기서 권한 추가해야함
36+ const payload = { sub : user . id } ;
37+ const accessToken = this . tokenService . generateAccessToken ( payload ) ;
38+ const refreshToken = this . tokenService . generateRefreshToken ( payload ) ;
3439
3540 // 토큰을 쿠키에 담아서 메인 페이지로 리디렉션
36- res . cookie ( 'accessToken' , accessToken , { httpOnly : true , maxAge : HOUR } ) ;
37- res . cookie ( 'refreshToken' , refreshToken , {
38- httpOnly : true ,
39- maxAge : WEEK ,
40- } ) ;
41+ this . tokenService . setAccessTokenCookie ( res , accessToken ) ;
42+ this . tokenService . setRefreshTokenCookie ( res , refreshToken ) ;
43+
4144 res . redirect ( 302 , '/' ) ;
4245 }
4346
@@ -51,37 +54,31 @@ export class AuthController {
5154 @Get ( 'kakao/callback' )
5255 @UseGuards ( AuthGuard ( 'kakao' ) )
5356 async kakaoCallback ( @Req ( ) req , @Res ( ) res : Response ) {
54- // 카카오 인증 후 사용자 정보 반환
57+ /// 카카오 인증 후 사용자 정보 반환
5558 const user = req . user ;
56- // TODO: 후에 권한 (workspace 조회, 편집 기능)도 payload에 추가
57- const payload = { sub : user . id , provider : user . provider } ;
58- const accessToken = this . jwtService . sign ( payload , { expiresIn : '1h' } ) ;
59- const refreshToken = this . jwtService . sign ( payload , { expiresIn : '7d' } ) ;
59+
60+ // primary Key인 id 포함 payload 생성함
61+ // TODO: 여기서 권한 추가해야함
62+ const payload = { sub : user . id } ;
63+ const accessToken = this . tokenService . generateAccessToken ( payload ) ;
64+ const refreshToken = this . tokenService . generateRefreshToken ( payload ) ;
6065
6166 // 토큰을 쿠키에 담아서 메인 페이지로 리디렉션
62- res . cookie ( 'accessToken' , accessToken , { httpOnly : true , maxAge : HOUR } ) ;
63- res . cookie ( 'refreshToken' , refreshToken , {
64- httpOnly : true ,
65- maxAge : WEEK ,
66- } ) ;
67+ this . tokenService . setAccessTokenCookie ( res , accessToken ) ;
68+ this . tokenService . setRefreshTokenCookie ( res , refreshToken ) ;
69+
6770 res . redirect ( 302 , '/' ) ;
6871 }
6972
70- @Post ( 'refresh' )
71- async refreshAccessToken ( @Req ( ) req , @Res ( ) res : Response ) {
72- const { refreshToken } = req . body ;
73-
74- const decoded = this . jwtService . verify ( refreshToken , {
75- secret : process . env . JWT_SECRET ,
76- } ) ;
77- const payload = { sub : decoded . sub , provider : decoded . provider } ;
78- const newAccessToken = this . jwtService . sign ( payload , { expiresIn : '1h' } ) ;
79- res . cookie ( 'accessToken' , newAccessToken , {
80- httpOnly : true ,
81- maxAge : HOUR ,
82- } ) ;
83- return res . json ( {
84- message : '새로운 Access Token 발급 성공' ,
73+ @ApiResponse ( { type : MessageResponseDto } )
74+ @ApiOperation ( { summary : '사용자가 로그아웃합니다.' } )
75+ @Post ( 'logout' )
76+ @UseGuards ( JwtAuthGuard ) // JWT 인증 검사
77+ logout ( @Res ( ) res : Response ) {
78+ // 쿠키 삭제 (옵션이 일치해야 삭제됨)
79+ this . tokenService . clearCookies ( res ) ;
80+ return res . status ( 200 ) . json ( {
81+ message : AuthResponseMessage . AUTH_LOGGED_OUT ,
8582 } ) ;
8683 }
8784
0 commit comments