From 687102fd34799b35036fc712b8ff06073ef355f9 Mon Sep 17 00:00:00 2001 From: HeeDragoN1123 Date: Tue, 24 Oct 2023 19:51:58 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[=EC=88=98=EC=A0=95]=20ci=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=EB=A1=9C=20=EC=9D=B4=EC=A0=84=EB=B2=84=EC=A0=84=20?= =?UTF-8?q?=ED=91=B8=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/auth/auth.service.ts | 93 ++++++++++++++++++++++++++++------------ 1 file changed, 66 insertions(+), 27 deletions(-) diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index db202a9..d8237d0 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -1,5 +1,4 @@ import { - BadRequestException, Injectable, NotFoundException, UnauthorizedException, @@ -22,7 +21,9 @@ export class AuthService { // 리팩토링 시 res 빼도 작동하는지 테스트 accessToken: string; refreshToken: string; - userId: number; + + //user: User; // User 정보를 반환하기 위한 타입 + userId: number; // userId만 반환 }> { // 1. 이메일이 일치하는 유저를 DB에서 찾기 const user = await this.usersService.findByEmail({ email }); @@ -40,15 +41,12 @@ export class AuthService { if (!isAuth) throw new UnauthorizedException('비밀번호가 일치하지 않습니다.'); + // const isdeletedAt // 4. 리프레시 토큰 생성 - const refreshToken = this.setRefreshToken({ user }); + const refreshToken = this.setRefreshToken({ user, res }); // 5. 액세스 토큰 및 리프레시 토큰을 반환 - const accessToken = this.getAccessToken({ user }); - - res.header('accessToken', accessToken); - - res.header('refreshToken', refreshToken); + const accessToken = this.getAccessToken({ user, res }); // 6. DB에 리프레시 토큰을 저장한다. await this.prisma.user.update({ @@ -58,26 +56,38 @@ export class AuthService { }, }); - return { accessToken, refreshToken, userId: user.userId }; + //Authorization로 보내도록 결정되면 이렇게 수정(피드백 받으면 좋을 내용) + // res.header('Authorization', `Bearer ${accessToken}`); + // res.header('RefreshToken', refreshToken); + + //TODO : user값 대신 userId값만 넘어가게 수정해야함 () + return { accessToken, refreshToken, userId: user.userId }; //리턴값 } - getAccessToken({ user }): string { + getAccessToken({ user, res }): string { const accessToken = this.jwtService.sign( { sub: user.userId }, { secret: process.env.JWT_ACCESS_KEY, expiresIn: '36000s' } ); - + //res.cookie('accessToken', accessToken); + // res.header('accessToken', accessToken); // 클라이언트로 액세스 토큰을 반환 + //res.header('Authorization', `Bearer ${accessToken}`); // 클라이언트로 액세스토큰을 Authorization 에 Bearer 로 반환 + //console.log('엑세스 토큰 확인용 로그', user); return accessToken; + // return res.header(accessToken); } - setRefreshToken({ user }): string { + setRefreshToken({ user, res }): string { // 리프레시 토큰을 생성하는 로직을 구현 const refreshToken = this.jwtService.sign( { sub: user.userId }, { secret: process.env.JWT_REFRESH_KEY, expiresIn: '2w' } ); - + //res.cookie('refreshToken', refreshToken); + // res.header('refreshToken', refreshToken); // 클라이언트로 리프레시 토큰을 반환 + //console.log('리프레시 토큰 확인용 로그', user); return refreshToken; + // return res.header(refreshToken); } async refreshAccessToken(refreshToken: string): Promise { @@ -87,11 +97,9 @@ export class AuthService { }); // 리프레시 토큰이 유효하다면 새로운 액세스 토큰을 발급 - const userId = decodedToken.sub; // 추출된 사용자 ID - const newAccessToken = await this.getAccessToken({ - user: { userId }, // 사용자 ID를 전달 - // res: null, + user: decodedToken, + res: null, }); return newAccessToken; @@ -100,7 +108,7 @@ export class AuthService { async OAuthLogin({ req, res }): Promise<{ accessToken: string; refreshToken: string; - // userId: number; + userId: number; }> { // 1. 회원조회 let user = await this.usersService.findByEmail({ email: req.user.email }); // user를 찾아서 @@ -114,15 +122,15 @@ export class AuthService { confirmPassword: req.user.password, // 비밀번호를 해싱하여 저장 intro: req.user.intro, profileImg: req.user.profileImg, + // 다른 필드도 설정해야 할 수 있음 }; // console.log('소셜 로그인 회원가입 : ', createUser); // createUser 정보를 콘솔에 출력 user = await this.usersService.create(createUser); - console.log('소셜로그인 회원가입 정보', createUser); } // 3. 회원가입이 되어 있다면? 로그인(AT, RT를 생성해서 브라우저에 전송)한다 - const accessToken = this.getAccessToken({ user }); // res를 전달 - const refreshToken = this.setRefreshToken({ user }); // res를 전달 + const accessToken = this.getAccessToken({ user, res }); // res를 전달 + const refreshToken = this.setRefreshToken({ user, res }); // res를 전달 // 4. 로그인이 되면 DB에 리프레시 토큰을 저장한다. await this.prisma.user.update({ where: { userId: user.userId }, @@ -131,19 +139,50 @@ export class AuthService { }, }); + //Authorization로 보내도록 결정되면 이렇게 수정(피드백 받으면 좋을 내용) + // res.header('Authorization', `Bearer ${accessToken}`); + // res.header('RefreshToken', refreshToken); + + // res.header('accessToken', accessToken); + // res.header('refreshToken', refreshToken); + res.header('userId', user.userId); + + res.cookie('accessToken', accessToken, { + httpOnly: false, // 배포시에 true + sameSite: 'none', + secure: false, // 배포시에 true + }); + + res.cookie('refreshToken', refreshToken, { + httpOnly: false, // 배포시에 true + sameSite: 'none', + secure: false, // 배포시에 true + }); + + // res.cookie('accessToken', token, { + // httpOnly: false, + // secure: process.env.NODE_ENV === 'production', + // maxAge: 1000 * 60 * 60, + // }); + console.log('로컬 엑세스 토큰', accessToken); console.log('로컬 리프레시 토큰', refreshToken); console.log(user.userId); // 리다이렉션 - return res.redirect( + res.redirect( `http://localhost:5500?accessToken=${encodeURIComponent( accessToken - )}&refreshToken=${encodeURIComponent(refreshToken)}` + )}&refreshToken=${encodeURIComponent( + refreshToken + )}&userId=${encodeURIComponent(user.userId)}` ); - //&userId=${encodeURIComponent(user.userId)} - // return res.redirect('http://localhost:5500'); - // return { accessToken, refreshToken }; - //return { accessToken, refreshToken, userId: user.userId }; + // 메인페이지뒤에 ? 해서 userId를 보내야한다. + // `http://localhost:5500?userId=${user.userId}` + //https://www.totobon6125.store/ + // https://www.totobon6125.store?userId=${user.userId} + //http://localhost:5173/ + //http://127.0.0.1:5500 + return { accessToken, refreshToken, userId: user.userId }; } } From 54943ad4aaa60231659cbf1e78f30884d5e39df0 Mon Sep 17 00:00:00 2001 From: HeeDragoN1123 Date: Tue, 24 Oct 2023 20:05:50 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[=EC=88=98=EC=A0=95]=20ci=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EB=A1=9C=EC=9D=B8=ED=95=B4=20=EB=8B=A4=EC=8B=9C=20?= =?UTF-8?q?=ED=91=B8=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/auth/auth.service.ts | 91 +++++++++++----------------------------- 1 file changed, 24 insertions(+), 67 deletions(-) diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index d8237d0..4b45b39 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -21,9 +21,6 @@ export class AuthService { // 리팩토링 시 res 빼도 작동하는지 테스트 accessToken: string; refreshToken: string; - - //user: User; // User 정보를 반환하기 위한 타입 - userId: number; // userId만 반환 }> { // 1. 이메일이 일치하는 유저를 DB에서 찾기 const user = await this.usersService.findByEmail({ email }); @@ -41,12 +38,15 @@ export class AuthService { if (!isAuth) throw new UnauthorizedException('비밀번호가 일치하지 않습니다.'); - // const isdeletedAt // 4. 리프레시 토큰 생성 - const refreshToken = this.setRefreshToken({ user, res }); + const refreshToken = this.setRefreshToken({ user }); // 5. 액세스 토큰 및 리프레시 토큰을 반환 - const accessToken = this.getAccessToken({ user, res }); + const accessToken = this.getAccessToken({ user }); + + res.header('accessToken', accessToken); + + res.header('refreshToken', refreshToken); // 6. DB에 리프레시 토큰을 저장한다. await this.prisma.user.update({ @@ -56,38 +56,26 @@ export class AuthService { }, }); - //Authorization로 보내도록 결정되면 이렇게 수정(피드백 받으면 좋을 내용) - // res.header('Authorization', `Bearer ${accessToken}`); - // res.header('RefreshToken', refreshToken); - - //TODO : user값 대신 userId값만 넘어가게 수정해야함 () - return { accessToken, refreshToken, userId: user.userId }; //리턴값 + return { accessToken, refreshToken }; } - getAccessToken({ user, res }): string { + getAccessToken({ user }): string { const accessToken = this.jwtService.sign( { sub: user.userId }, { secret: process.env.JWT_ACCESS_KEY, expiresIn: '36000s' } ); - //res.cookie('accessToken', accessToken); - // res.header('accessToken', accessToken); // 클라이언트로 액세스 토큰을 반환 - //res.header('Authorization', `Bearer ${accessToken}`); // 클라이언트로 액세스토큰을 Authorization 에 Bearer 로 반환 - //console.log('엑세스 토큰 확인용 로그', user); + return accessToken; - // return res.header(accessToken); } - setRefreshToken({ user, res }): string { + setRefreshToken({ user }): string { // 리프레시 토큰을 생성하는 로직을 구현 const refreshToken = this.jwtService.sign( { sub: user.userId }, { secret: process.env.JWT_REFRESH_KEY, expiresIn: '2w' } ); - //res.cookie('refreshToken', refreshToken); - // res.header('refreshToken', refreshToken); // 클라이언트로 리프레시 토큰을 반환 - //console.log('리프레시 토큰 확인용 로그', user); + return refreshToken; - // return res.header(refreshToken); } async refreshAccessToken(refreshToken: string): Promise { @@ -97,9 +85,11 @@ export class AuthService { }); // 리프레시 토큰이 유효하다면 새로운 액세스 토큰을 발급 + const userId = decodedToken.sub; // 추출된 사용자 ID + const newAccessToken = await this.getAccessToken({ - user: decodedToken, - res: null, + user: { userId }, // 사용자 ID를 전달 + // res: null, }); return newAccessToken; @@ -108,7 +98,6 @@ export class AuthService { async OAuthLogin({ req, res }): Promise<{ accessToken: string; refreshToken: string; - userId: number; }> { // 1. 회원조회 let user = await this.usersService.findByEmail({ email: req.user.email }); // user를 찾아서 @@ -122,15 +111,15 @@ export class AuthService { confirmPassword: req.user.password, // 비밀번호를 해싱하여 저장 intro: req.user.intro, profileImg: req.user.profileImg, - // 다른 필드도 설정해야 할 수 있음 }; // console.log('소셜 로그인 회원가입 : ', createUser); // createUser 정보를 콘솔에 출력 user = await this.usersService.create(createUser); + console.log('소셜로그인 회원가입 정보', createUser); } // 3. 회원가입이 되어 있다면? 로그인(AT, RT를 생성해서 브라우저에 전송)한다 - const accessToken = this.getAccessToken({ user, res }); // res를 전달 - const refreshToken = this.setRefreshToken({ user, res }); // res를 전달 + const accessToken = this.getAccessToken({ user }); // res를 전달 + const refreshToken = this.setRefreshToken({ user }); // res를 전달 // 4. 로그인이 되면 DB에 리프레시 토큰을 저장한다. await this.prisma.user.update({ where: { userId: user.userId }, @@ -139,50 +128,18 @@ export class AuthService { }, }); - //Authorization로 보내도록 결정되면 이렇게 수정(피드백 받으면 좋을 내용) - // res.header('Authorization', `Bearer ${accessToken}`); - // res.header('RefreshToken', refreshToken); - - // res.header('accessToken', accessToken); - // res.header('refreshToken', refreshToken); - res.header('userId', user.userId); - - res.cookie('accessToken', accessToken, { - httpOnly: false, // 배포시에 true - sameSite: 'none', - secure: false, // 배포시에 true - }); - - res.cookie('refreshToken', refreshToken, { - httpOnly: false, // 배포시에 true - sameSite: 'none', - secure: false, // 배포시에 true - }); - - // res.cookie('accessToken', token, { - // httpOnly: false, - // secure: process.env.NODE_ENV === 'production', - // maxAge: 1000 * 60 * 60, - // }); - console.log('로컬 엑세스 토큰', accessToken); console.log('로컬 리프레시 토큰', refreshToken); - console.log(user.userId); // 리다이렉션 - res.redirect( + return res.redirect( `http://localhost:5500?accessToken=${encodeURIComponent( accessToken - )}&refreshToken=${encodeURIComponent( - refreshToken - )}&userId=${encodeURIComponent(user.userId)}` + )}&refreshToken=${encodeURIComponent(refreshToken)}` ); - // 메인페이지뒤에 ? 해서 userId를 보내야한다. - // `http://localhost:5500?userId=${user.userId}` - //https://www.totobon6125.store/ - // https://www.totobon6125.store?userId=${user.userId} - //http://localhost:5173/ - //http://127.0.0.1:5500 - return { accessToken, refreshToken, userId: user.userId }; + //&userId=${encodeURIComponent(user.userId)} + // return res.redirect('http://localhost:5500'); + // return { accessToken, refreshToken }; + //return { accessToken, refreshToken, userId: user.userId }; } }