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' ;
44import { JwtService } from '@nestjs/jwt' ;
55import { JwtAuthGuard } from './guards/jwt-auth.guard' ;
6+ import { Response } from 'express' ;
7+
8+ const HOUR = 60 * 60 * 1000 ;
9+ const WEEK = 7 * 24 * 60 * 60 * 1000 ;
610
711@Controller ( 'auth' )
812export class AuthController {
@@ -20,19 +24,21 @@ export class AuthController {
2024
2125 @Get ( 'naver/callback' )
2226 @UseGuards ( AuthGuard ( 'naver' ) )
23- async naverCallback ( @Req ( ) req ) {
27+ async naverCallback ( @Req ( ) req , @ Res ( ) res : Response ) {
2428 // 네이버 인증 후 사용자 정보 반환
2529 const user = req . user ;
2630 // TODO: 후에 권한 (workspace 조회, 편집 기능)도 payload에 추가
2731 const payload = { sub : user . id , provider : user . provider } ;
2832 const accessToken = this . jwtService . sign ( payload , { expiresIn : '1h' } ) ;
2933 const refreshToken = this . jwtService . sign ( payload , { expiresIn : '7d' } ) ;
30- return {
31- message : '네이버 로그인 성공' ,
32- user,
33- accessToken,
34- refreshToken,
35- } ;
34+
35+ // 토큰을 쿠키에 담아서 메인 페이지로 리디렉션
36+ res . cookie ( 'accessToken' , accessToken , { httpOnly : true , maxAge : HOUR } ) ;
37+ res . cookie ( 'refreshToken' , refreshToken , {
38+ httpOnly : true ,
39+ maxAge : WEEK ,
40+ } ) ;
41+ res . redirect ( 302 , '/' ) ;
3642 }
3743
3844 @Get ( 'kakao' )
@@ -44,34 +50,39 @@ export class AuthController {
4450
4551 @Get ( 'kakao/callback' )
4652 @UseGuards ( AuthGuard ( 'kakao' ) )
47- async kakaoCallback ( @Req ( ) req ) {
53+ async kakaoCallback ( @Req ( ) req , @ Res ( ) res : Response ) {
4854 // 카카오 인증 후 사용자 정보 반환
4955 const user = req . user ;
5056 // TODO: 후에 권한 (workspace 조회, 편집 기능)도 payload에 추가
5157 const payload = { sub : user . id , provider : user . provider } ;
5258 const accessToken = this . jwtService . sign ( payload , { expiresIn : '1h' } ) ;
5359 const refreshToken = this . jwtService . sign ( payload , { expiresIn : '7d' } ) ;
54- return {
55- message : '카카오 로그인 성공' ,
56- user,
57- accessToken,
58- refreshToken,
59- } ;
60+
61+ // 토큰을 쿠키에 담아서 메인 페이지로 리디렉션
62+ res . cookie ( 'accessToken' , accessToken , { httpOnly : true , maxAge : HOUR } ) ;
63+ res . cookie ( 'refreshToken' , refreshToken , {
64+ httpOnly : true ,
65+ maxAge : WEEK ,
66+ } ) ;
67+ res . redirect ( 302 , '/' ) ;
6068 }
6169
6270 @Post ( 'refresh' )
63- async refreshAccessToken ( @Req ( ) req ) {
71+ async refreshAccessToken ( @Req ( ) req , @ Res ( ) res : Response ) {
6472 const { refreshToken } = req . body ;
6573
6674 const decoded = this . jwtService . verify ( refreshToken , {
6775 secret : process . env . JWT_SECRET ,
6876 } ) ;
6977 const payload = { sub : decoded . sub , provider : decoded . provider } ;
7078 const newAccessToken = this . jwtService . sign ( payload , { expiresIn : '1h' } ) ;
71- return {
79+ res . cookie ( 'accessToken' , newAccessToken , {
80+ httpOnly : true ,
81+ maxAge : HOUR ,
82+ } ) ;
83+ return res . json ( {
7284 message : '새로운 Access Token 발급 성공' ,
73- accessToken : newAccessToken ,
74- } ;
85+ } ) ;
7586 }
7687
7788 // Example: 로그인한 사용자만 접근할 수 있는 엔드포인트
0 commit comments