Skip to content

Commit 01891b2

Browse files
committed
fix: Rt 값 쿠키에 넣도록 수정, 랜덤 비밀번호 삭제, 로그인 비밀번호 검증 추가, 사용하지 않는 import문 삭제 #23
1 parent 59dc29b commit 01891b2

File tree

3 files changed

+34
-24
lines changed

3 files changed

+34
-24
lines changed

src/main/java/org/dfbf/soundlink/domain/user/controller/AuthController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public ResponseResult reissueToken(HttpServletRequest request, HttpServletRespon
4141
// 카카오 로그인 (인가 코드 받아서 회원가입 또는 로그인 진행)
4242
@Operation(summary = "카카오 로그인", description = "카카오 로그인 후 JWT 발급")
4343
@GetMapping("/login/kakao")
44-
public ResponseResult kakaoCallback(@RequestParam String code) {
45-
return kakaoAuthService.kakaoLogin(code);
44+
public ResponseResult kakaoCallback(@RequestParam String code, HttpServletResponse response) {
45+
return kakaoAuthService.kakaoLogin(code, response);
4646
}
4747
}

src/main/java/org/dfbf/soundlink/domain/user/service/KakaoAuthService.java

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.dfbf.soundlink.domain.user.service;
22

3+
import jakarta.servlet.http.HttpServletResponse;
34
import lombok.RequiredArgsConstructor;
45
import org.dfbf.soundlink.domain.user.dto.response.KakaoTokenResponseDTO;
56
import org.dfbf.soundlink.domain.user.dto.response.KakaoUserDTO;
@@ -11,11 +12,13 @@
1112
import org.dfbf.soundlink.global.comm.enums.SocialType;
1213
import org.dfbf.soundlink.global.exception.ResponseResult;
1314
import org.springframework.beans.factory.annotation.Value;
15+
import org.springframework.http.ResponseCookie;
1416
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
1517
import org.springframework.stereotype.Service;
1618
import org.springframework.util.LinkedMultiValueMap;
1719
import org.springframework.util.MultiValueMap;
1820

21+
import java.util.HashMap;
1922
import java.util.Map;
2023
import java.util.Optional;
2124

@@ -28,21 +31,21 @@ public class KakaoAuthService {
2831
private final UserRepository userRepository;
2932
private final JwtProvider jwtProvider;
3033
private final BCryptPasswordEncoder passwordEncoder;
31-
private final TokenService tokenService;
34+
private static final String domain = "";
3235

3336
@Value("${kakao.client-id}")
3437
private String clientId;
3538

3639
@Value("${kakao.redirect-uri}")
3740
private String redirectUri;
3841

39-
@Value("${kakao.password}")
40-
private String kakaoPassword;
42+
@Value("${REFRESH_TOKEN_EXPIRATION_TIME}")
43+
private int REFRESH_TOKEN_EXPIRATION_TIME;
4144

4245
/**
4346
* 카카오 로그인 및 JWT 발급
4447
*/
45-
public ResponseResult kakaoLogin(String code) {
48+
public ResponseResult kakaoLogin(String code, HttpServletResponse response) {
4649
// 요청 파라미터 설정 (JSONObject 대신 하나의 Key와 하나 이상의 value로 이루어진 리스트를 쌍으로 받기 위해 LinkedMultiValueMap 사용)
4750
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
4851
params.add("grant_type", "authorization_code");
@@ -63,7 +66,7 @@ public ResponseResult kakaoLogin(String code) {
6366

6467
if (existingUser.isPresent()) {
6568
// 기존 사용자가 존재 시, 로그인 처리
66-
return generateTokenResponse(existingUser.get());
69+
return generateTokenResponse(existingUser.get(), response);
6770
} else {
6871
// 신규 가입은 닉네임 중복 확인 필요
6972
if (userRepository.existsByNickname(kakaoNickname)) {
@@ -72,25 +75,26 @@ public ResponseResult kakaoLogin(String code) {
7275
}
7376
// 회원가입
7477
User newUser = registerNewKakaoUser(kakaoUser, kakaoNickname);
75-
return generateTokenResponse(newUser);
78+
return generateTokenResponse(newUser, response);
7679
}
7780
}
7881

7982
/**
8083
* JWT 토큰 생성
8184
*/
82-
private ResponseResult generateTokenResponse(User user) {
85+
private ResponseResult generateTokenResponse(User user, HttpServletResponse response) {
8386
String jwtAccessToken = jwtProvider.createAccessToken(user.getUserId());
8487
String jwtRefreshToken = jwtProvider.createRefreshToken(user.getUserId());
8588

86-
tokenService.updateRefreshToken(user.getUserId(), jwtRefreshToken);
89+
//refreshToken - 쿠키
90+
ResponseCookie refreshCookie = getRefreshToken(jwtRefreshToken);
91+
response.setHeader("Set-Cookie", refreshCookie.toString());
8792

88-
Map<String, String> authResponse = Map.of(
89-
"accessToken", jwtAccessToken,
90-
"refreshToken", jwtRefreshToken
91-
);
93+
//accessToken - 바디
94+
Map<String, String> responseBody = new HashMap<>();
95+
responseBody.put("accessToken", jwtAccessToken);
9296

93-
return new ResponseResult(authResponse);
97+
return new ResponseResult(responseBody);
9498
}
9599

96100
/**
@@ -102,7 +106,7 @@ private User registerNewKakaoUser(KakaoUserDTO kakaoUser, String nickname) {
102106
.socialId(Long.valueOf(kakaoUser.id()))
103107
.socialType(SocialType.KAKAO)
104108
.loginId("kakao_" + kakaoUser.id()) // 카카오 ID 기반 로그인 ID 생성
105-
.password(passwordEncoder.encode(kakaoPassword))
109+
.password(passwordEncoder.encode(null))
106110
.email(kakaoUser.kakao_account().email())
107111
.build();
108112
return userRepository.save(newUser);
@@ -123,4 +127,16 @@ private String generateUniqueNickname(String baseNickname) {
123127
}
124128
return newNickname;
125129
}
130+
131+
// RefreshToken을 쿠키로 설정
132+
private ResponseCookie getRefreshToken(String refreshToken) {
133+
return ResponseCookie
134+
.from("REFRESHTOKEN", refreshToken)
135+
.domain(domain)
136+
.path("/")
137+
.httpOnly(true)
138+
.secure(false)
139+
.maxAge(REFRESH_TOKEN_EXPIRATION_TIME/1000) // 만료시간 설정(밀리초 -> 초로 변경)
140+
.build();
141+
}
126142
}

src/main/java/org/dfbf/soundlink/domain/user/service/UserService.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,16 @@
2020
import org.dfbf.soundlink.domain.user.repository.ProfileMusicRepository;
2121
import org.dfbf.soundlink.domain.user.repository.UserRepository;
2222
import org.dfbf.soundlink.global.auth.JwtProvider;
23-
import org.dfbf.soundlink.global.auth.TokenProperties;
2423
import org.dfbf.soundlink.global.exception.ErrorCode;
2524
import org.dfbf.soundlink.global.exception.ResponseResult;
2625
import org.springframework.beans.factory.annotation.Value;
27-
import org.springframework.cache.annotation.CachePut;
28-
import org.springframework.data.redis.core.RedisTemplate;
2926
import org.springframework.http.ResponseCookie;
3027
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
3128
import org.springframework.stereotype.Service;
3229

3330
import javax.naming.AuthenticationException;
3431
import java.util.HashMap;
3532
import java.util.Map;
36-
import java.util.Optional;
3733

3834
@Slf4j
3935
@Service
@@ -49,9 +45,6 @@ public class UserService {
4945
private final RedisService redisService;
5046

5147
private final JwtProvider jwtProvider;
52-
private final TokenProperties tokenProperties;
53-
54-
private RedisTemplate<String, String> redisTemplate;
5548
private final TokenService tokenService;
5649

5750
private static final String domain = "";
@@ -233,7 +226,8 @@ public ResponseResult login(LoginReqDto loginReqDto, HttpServletResponse respons
233226
return new ResponseResult(ErrorCode.FAIL_TO_FIND_USER, "계정을 찾을 수 없습니다.");
234227
}
235228
// 비밀번호 검증(암호화 된 비밀번호 비교)
236-
if(!passwordEncoder.matches(loginReqDto.password(), userRepository.findPasswordByLoginId(loginReqDto.loginId()))){
229+
if( loginReqDto.password() == null || loginReqDto.password().isEmpty() ||
230+
!passwordEncoder.matches(loginReqDto.password(), userRepository.findPasswordByLoginId(loginReqDto.loginId()))){
237231
return new ResponseResult( ErrorCode.NOT_EQUALS_PASSWORD,"잘못된 비밀번호 입니다.");
238232
}
239233

0 commit comments

Comments
 (0)