|
1 | 1 | package BE_Elixir.Elixir.domain.member.service; |
2 | 2 |
|
| 3 | +import BE_Elixir.Elixir.domain.auth.dto.response.TokenResponseDTO; |
| 4 | +import BE_Elixir.Elixir.domain.member.dto.SocialSignUpDTO; |
3 | 5 | import BE_Elixir.Elixir.domain.member.dto.request.SignUpRequestDTO; |
4 | 6 | import BE_Elixir.Elixir.domain.member.dto.request.SocialSignUpRequestDTO; |
5 | 7 | import BE_Elixir.Elixir.domain.member.entity.Member; |
| 8 | +import BE_Elixir.Elixir.domain.member.entity.MemberDetails; |
6 | 9 | import BE_Elixir.Elixir.domain.member.repository.MemberRepository; |
7 | 10 | import BE_Elixir.Elixir.global.enums.LoginType; |
8 | 11 | import BE_Elixir.Elixir.global.exception.CustomException; |
|
17 | 20 | import lombok.RequiredArgsConstructor; |
18 | 21 | import lombok.extern.slf4j.Slf4j; |
19 | 22 | import org.springframework.dao.DataIntegrityViolationException; |
| 23 | +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; |
| 24 | +import org.springframework.security.core.Authentication; |
20 | 25 | import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; |
21 | 26 | import org.springframework.stereotype.Service; |
22 | 27 | import org.springframework.web.multipart.MultipartFile; |
|
32 | 37 | public class MemberService { |
33 | 38 |
|
34 | 39 | private final MemberRepository memberRepository; |
| 40 | + private final MemberDetailsService memberDetailsService; |
35 | 41 | private final BCryptPasswordEncoder passwordEncoder; |
36 | 42 | private final JwtProvider jwtProvider; |
37 | 43 | private final RedisAuthService redisAuthService; |
38 | 44 | private final RedisEmailVerificationService redisMailVerificationService; |
39 | 45 | private final S3Service s3Service; |
40 | 46 | private final EmailService mailService; |
41 | | - |
42 | 47 | // 이메일 중복 체크 |
43 | 48 | public boolean isEmailDuplicated(String email) { |
44 | 49 | return memberRepository.existsByEmail(email); |
@@ -104,7 +109,7 @@ public Member localSignUp(SignUpRequestDTO request, MultipartFile profileImage) |
104 | 109 | } |
105 | 110 |
|
106 | 111 | // 소셜 회원용 회원가입 메소드 |
107 | | - public Member socialSignUp(LoginType loginType, SocialSignUpRequestDTO request, MultipartFile profileImage) { |
| 112 | + public SocialSignUpDTO socialSignUp(LoginType loginType, SocialSignUpRequestDTO request, MultipartFile profileImage) { |
108 | 113 | // 소셜 회원이 맞는지 검증 |
109 | 114 | if (!loginType.isSocial()) { |
110 | 115 | throw new CustomException(ErrorCode.LOGIN_TYPE_MISMATCH); |
@@ -156,7 +161,27 @@ public Member socialSignUp(LoginType loginType, SocialSignUpRequestDTO request, |
156 | 161 | member.setProfileUrl(request.getProfileImageUrl()); |
157 | 162 | } |
158 | 163 |
|
159 | | - return memberRepository.save(member); |
| 164 | + memberRepository.save(member); |
| 165 | + |
| 166 | + // JWT 토큰 발급 |
| 167 | + // Spring Security Authentication 객체 생성 |
| 168 | + MemberDetails memberDetails = memberDetailsService.loadUserByUsername(member.getEmail()); |
| 169 | + Authentication authentication = new UsernamePasswordAuthenticationToken( |
| 170 | + memberDetails, "", memberDetails.getAuthorities() |
| 171 | + ); |
| 172 | + |
| 173 | + // JWT 생성 |
| 174 | + TokenResponseDTO tokenResponse = jwtProvider.generateToken(authentication); |
| 175 | + String refreshToken = tokenResponse.getRefreshToken(); |
| 176 | + |
| 177 | + // Redis에 Refresh Token 저장 |
| 178 | + redisAuthService.saveRefreshToken(member.getEmail(), refreshToken); |
| 179 | + log.info("[소셜 로그인] Refresh Token Redis에 저장: email={}, token={}", member.getEmail(), refreshToken); |
| 180 | + |
| 181 | + return SocialSignUpDTO.builder() |
| 182 | + .member(member) |
| 183 | + .tokenResponseDTO(tokenResponse) |
| 184 | + .build(); |
160 | 185 |
|
161 | 186 | } catch (DataIntegrityViolationException e) { |
162 | 187 | if (e.getMessage().toUpperCase().contains("EMAIL_UNIQUE")) { |
|
0 commit comments