1- import { Controller , Get , UseGuards , Req , Post } from '@nestjs/common' ;
1+ import { 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' ;
5+ import { Response } from 'express' ;
6+ import { MessageResponseDto } from './dtos/messageResponse.dto' ;
7+ import { ApiOperation , ApiResponse } from '@nestjs/swagger' ;
8+ import { TokenService } from './token/token.service' ;
9+
10+ export enum AuthResponseMessage {
11+ AUTH_LOGGED_OUT = '로그아웃하였습니다.' ,
12+ }
613
714@Controller ( 'auth' )
815export class AuthController {
916 constructor (
1017 private readonly authService : AuthService ,
11- private readonly jwtService : JwtService ,
18+ private readonly tokenService : TokenService ,
1219 ) { }
1320
1421 @Get ( 'naver' )
@@ -20,19 +27,21 @@ export class AuthController {
2027
2128 @Get ( 'naver/callback' )
2229 @UseGuards ( AuthGuard ( 'naver' ) )
23- async naverCallback ( @Req ( ) req ) {
30+ async naverCallback ( @Req ( ) req , @ Res ( ) res : Response ) {
2431 // 네이버 인증 후 사용자 정보 반환
2532 const user = req . user ;
26- // TODO: 후에 권한 (workspace 조회, 편집 기능)도 payload에 추가
27- const payload = { sub : user . id , provider : user . provider } ;
28- const accessToken = this . jwtService . sign ( payload , { expiresIn : '1h' } ) ;
29- const refreshToken = this . jwtService . sign ( payload , { expiresIn : '7d' } ) ;
30- return {
31- message : '네이버 로그인 성공' ,
32- user,
33- accessToken,
34- refreshToken,
35- } ;
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 ) ;
39+
40+ // 토큰을 쿠키에 담아서 메인 페이지로 리디렉션
41+ this . tokenService . setAccessTokenCookie ( res , accessToken ) ;
42+ this . tokenService . setRefreshTokenCookie ( res , refreshToken ) ;
43+
44+ res . redirect ( 302 , '/' ) ;
3645 }
3746
3847 @Get ( 'kakao' )
@@ -44,34 +53,32 @@ export class AuthController {
4453
4554 @Get ( 'kakao/callback' )
4655 @UseGuards ( AuthGuard ( 'kakao' ) )
47- async kakaoCallback ( @Req ( ) req ) {
48- // 카카오 인증 후 사용자 정보 반환
56+ async kakaoCallback ( @Req ( ) req , @ Res ( ) res : Response ) {
57+ /// 카카오 인증 후 사용자 정보 반환
4958 const user = req . user ;
50- // TODO: 후에 권한 (workspace 조회, 편집 기능)도 payload에 추가
51- const payload = { sub : user . id , provider : user . provider } ;
52- const accessToken = this . jwtService . sign ( payload , { expiresIn : '1h' } ) ;
53- const refreshToken = this . jwtService . sign ( payload , { expiresIn : '7d' } ) ;
54- return {
55- message : '카카오 로그인 성공' ,
56- user,
57- accessToken,
58- refreshToken,
59- } ;
60- }
6159
62- @Post ( 'refresh' )
63- async refreshAccessToken ( @Req ( ) req ) {
64- const { refreshToken } = req . body ;
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 ) ;
6565
66- const decoded = this . jwtService . verify ( refreshToken , {
67- secret : process . env . JWT_SECRET ,
66+ // 토큰을 쿠키에 담아서 메인 페이지로 리디렉션
67+ this . tokenService . setAccessTokenCookie ( res , accessToken ) ;
68+ this . tokenService . setRefreshTokenCookie ( res , refreshToken ) ;
69+
70+ res . redirect ( 302 , '/' ) ;
71+ }
72+
73+ @ApiResponse ( { type : MessageResponseDto } )
74+ @ApiOperation ( { summary : '사용자가 로그아웃합니다.' } )
75+ @Post ( 'logout' )
76+ logout ( @Res ( ) res : Response ) {
77+ // 쿠키 삭제 (옵션이 일치해야 삭제됨)
78+ this . tokenService . clearCookies ( res ) ;
79+ return res . status ( 200 ) . json ( {
80+ message : AuthResponseMessage . AUTH_LOGGED_OUT ,
6881 } ) ;
69- const payload = { sub : decoded . sub , provider : decoded . provider } ;
70- const newAccessToken = this . jwtService . sign ( payload , { expiresIn : '1h' } ) ;
71- return {
72- message : '새로운 Access Token 발급 성공' ,
73- accessToken : newAccessToken ,
74- } ;
7582 }
7683
7784 // Example: 로그인한 사용자만 접근할 수 있는 엔드포인트
0 commit comments