diff --git a/build.gradle b/build.gradle index 9f93980a..b6a2f8c4 100644 --- a/build.gradle +++ b/build.gradle @@ -142,10 +142,6 @@ dependencies { implementation 'io.micrometer:micrometer-core:1.7.6' - //Mail - implementation 'javax.mail:mail:1.4.7' - - } test { diff --git a/src/main/java/woojooin/planit/domain/member/domain/Member.java b/src/main/java/woojooin/planit/domain/member/domain/Member.java index 5c9f69ff..267bf37e 100644 --- a/src/main/java/woojooin/planit/domain/member/domain/Member.java +++ b/src/main/java/woojooin/planit/domain/member/domain/Member.java @@ -37,9 +37,6 @@ public class Member { private Double diversified; private String fcmToken; - private String authKey; - private int authStatus; - private List memberProducts; private List goals; private List accounts; diff --git a/src/main/java/woojooin/planit/domain/member/service/MemberService.java b/src/main/java/woojooin/planit/domain/member/service/MemberService.java index 581e1734..ac453e72 100644 --- a/src/main/java/woojooin/planit/domain/member/service/MemberService.java +++ b/src/main/java/woojooin/planit/domain/member/service/MemberService.java @@ -4,8 +4,6 @@ import woojooin.planit.domain.member.domain.Member; import woojooin.planit.domain.member.api.dto.res.InvestScoreRes; -import javax.mail.MessagingException; - public interface MemberService { Member findById(Long memberId); Member findByEmail(String email); diff --git a/src/main/java/woojooin/planit/domain/member/service/MemberServiceImpl.java b/src/main/java/woojooin/planit/domain/member/service/MemberServiceImpl.java index 05a3a60d..39d58442 100644 --- a/src/main/java/woojooin/planit/domain/member/service/MemberServiceImpl.java +++ b/src/main/java/woojooin/planit/domain/member/service/MemberServiceImpl.java @@ -1,10 +1,7 @@ package woojooin.planit.domain.member.service; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.mail.javamail.JavaMailSender; -import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import woojooin.planit.domain.member.domain.Member; import woojooin.planit.domain.member.api.dto.req.RealInvestTypeReq; import woojooin.planit.domain.member.api.dto.res.InvestScoreRes; @@ -12,18 +9,12 @@ import woojooin.planit.domain.member.repository.MemberRepository; import woojooin.planit.domain.openAi.dto.req.DefaultInvestTypeReq; -import javax.mail.MessagingException; -import javax.mail.internet.MimeMessage; -import java.util.UUID; - @Service public class MemberServiceImpl implements MemberService { @Autowired private MemberRepository memberRepository; @Autowired private MemberMapper memberMapper; - @Autowired - private JavaMailSender mailSender; @Override public Member findById(Long memberId) { @@ -74,5 +65,4 @@ public InvestScoreRes getInvestScore(Long id) { public String getInvestmentType(Long memberId) { return memberRepository.findInvestTypeById(memberId); } - } diff --git a/src/main/java/woojooin/planit/global/config/MailConfig.java b/src/main/java/woojooin/planit/global/config/MailConfig.java deleted file mode 100644 index 091467e9..00000000 --- a/src/main/java/woojooin/planit/global/config/MailConfig.java +++ /dev/null @@ -1,39 +0,0 @@ -package woojooin.planit.global.config; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; -import org.springframework.mail.javamail.JavaMailSender; -import org.springframework.mail.javamail.JavaMailSenderImpl; - -@Configuration -public class MailConfig { - @Value("${mail.host}") - private String mailHost; - @Value("${mail.port}") - private int mailPort; - @Value("${mail.username}") - private String mailUsername; - @Value("${mail.password}") - private String mailPassword; - - @Bean - public JavaMailSender javaMailSender() { - JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); - mailSender.setHost(mailHost); - mailSender.setPort(mailPort); - - mailSender.setUsername(mailUsername); - mailSender.setPassword(mailPassword); - - java.util.Properties props = mailSender.getJavaMailProperties(); - props.put("mail.transport.protocol", "smtp"); - props.put("mail.smtp.auth", "true"); - props.put("mail.smtp.starttls.enable", "true"); - props.put("mail.debug", "true"); - props.put("mail.smtp.ssl.protocols", "TLSv1.2"); - - return mailSender; - } -} diff --git a/src/main/java/woojooin/planit/global/response/ResponseCode.java b/src/main/java/woojooin/planit/global/response/ResponseCode.java index 82e56e0d..423f0bf1 100644 --- a/src/main/java/woojooin/planit/global/response/ResponseCode.java +++ b/src/main/java/woojooin/planit/global/response/ResponseCode.java @@ -32,8 +32,6 @@ public enum ResponseCode { DUPLICATE_EMAIL("AUTH-003", "이미 사용 중인 이메일입니다.", HttpStatus.BAD_REQUEST), INVALID_LOGIN("AUTH-004", "유효하지 않은 이메일 또는 비밀번호입니다.", HttpStatus.UNAUTHORIZED), REISSUE_FAILED("AUTH-005", "리프레시 토큰 재발급에 실패했습니다.", HttpStatus.UNAUTHORIZED), - AUTH_KEY_INVALID("AUTH-006", "유효하지 않은 인증 키입니다.", HttpStatus.BAD_REQUEST), - EMAIL_SEND_FAILED("AUTH-007", "이메일 전송에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR), // ISA Account Domain Errors ISA_MEMBER_NOT_FOUND("ISA-001", "해당 회원을 찾을 수 없습니다.", HttpStatus.NOT_FOUND), diff --git a/src/main/java/woojooin/planit/global/security/controller/AuthController.java b/src/main/java/woojooin/planit/global/security/controller/AuthController.java index 9d1f1f63..e5f92d20 100644 --- a/src/main/java/woojooin/planit/global/security/controller/AuthController.java +++ b/src/main/java/woojooin/planit/global/security/controller/AuthController.java @@ -3,13 +3,11 @@ import lombok.Data; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.AuthenticationException; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.web.bind.annotation.*; -import org.springframework.web.util.UriComponentsBuilder; import woojooin.planit.domain.member.domain.Member; import woojooin.planit.domain.member.service.MemberService; import woojooin.planit.global.exception.BusinessException; @@ -21,7 +19,6 @@ import woojooin.planit.global.security.dto.response.LoginRes; import woojooin.planit.global.security.service.AuthService; -import java.net.URI; import java.util.Collections; @Slf4j @@ -44,41 +41,7 @@ public ResponseEntity login(@RequestBody LoginReq request) { @PostMapping("/signup") public ResponseEntity signup(@RequestBody SignUpReq request) { authService.signup(request); - return ResponseEntity.ok("회원가입 요청이 완료되었습니다. 이메일을 확인해주세요."); - } - - @GetMapping("/auth/confirm-email") - public ResponseEntity confirmEmail(@RequestParam("email") String email, @RequestParam("authKey") String authKey) { - final String frontendCallbackUrl = "https://planit-murex.vercel.app"; - URI redirectUri; - - try { - authService.confirmEmail(email, authKey); - - redirectUri = UriComponentsBuilder.fromUriString(frontendCallbackUrl) - .queryParam("success", "true") - .build().toUri(); - - } catch (AuthenticationException e) { - log.error("Email confirm failed: {}", e.getMessage()); - - redirectUri = UriComponentsBuilder.fromUriString(frontendCallbackUrl) - .queryParam("success", "false") - .queryParam("error", "AUTH_KEY_INVALID") - .build().toUri(); - - } catch (Exception e) { - log.error("An unexpected error occurred during email confirmation", e); - redirectUri = UriComponentsBuilder.fromUriString(frontendCallbackUrl) - .queryParam("success", "false") - .queryParam("error", "SERVER_ERROR") - .build().toUri(); - } - - HttpHeaders headers = new HttpHeaders(); - headers.setLocation(redirectUri); - - return new ResponseEntity<>(headers, HttpStatus.FOUND); + return ResponseEntity.ok().build(); } @PostMapping("/reissue") diff --git a/src/main/java/woojooin/planit/global/security/jwt/JwtAuthenticationFilter.java b/src/main/java/woojooin/planit/global/security/jwt/JwtAuthenticationFilter.java index 63594870..8eccbe9c 100644 --- a/src/main/java/woojooin/planit/global/security/jwt/JwtAuthenticationFilter.java +++ b/src/main/java/woojooin/planit/global/security/jwt/JwtAuthenticationFilter.java @@ -48,11 +48,11 @@ protected void doFilterInternal(HttpServletRequest request, log.info("Processing JWT authentication for request: {}", request.getRequestURI()); - if ( request.getRequestURI().startsWith("/api")) { - log.info("Bypassing JWT filter for URI: {}", request.getRequestURI()); - filterChain.doFilter(request, response); - return; - } +// if ( request.getRequestURI().startsWith("/api")) { +// log.info("Bypassing JWT filter for URI: {}", request.getRequestURI()); +// filterChain.doFilter(request, response); +// return; +// } String token = resolveToken(request); @@ -102,10 +102,6 @@ protected void doFilterInternal(HttpServletRequest request, sendErrorResponse(response, "UNEXPECTED_ERROR", "예상치 못한 오류가 발생했습니다."); return; } - } else - { - sendErrorResponse(response, "UNAUTHORIZED", "인증 토큰이 없습니다."); - return; } filterChain.doFilter(request, response); } diff --git a/src/main/java/woojooin/planit/global/security/service/AuthService.java b/src/main/java/woojooin/planit/global/security/service/AuthService.java index 3369d070..8e3316d1 100644 --- a/src/main/java/woojooin/planit/global/security/service/AuthService.java +++ b/src/main/java/woojooin/planit/global/security/service/AuthService.java @@ -4,8 +4,6 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.mail.javamail.JavaMailSender; -import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -15,7 +13,6 @@ import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; -import org.springframework.transaction.annotation.Transactional; import woojooin.planit.domain.member.domain.Member; import woojooin.planit.domain.member.service.MemberService; import woojooin.planit.global.exception.BusinessException; @@ -28,9 +25,6 @@ import woojooin.planit.global.security.dto.response.LoginRes; import woojooin.planit.global.security.jwt.JwtTokenProvider; -import javax.mail.internet.MimeMessage; -import java.util.UUID; - @Service @RequiredArgsConstructor @Slf4j @@ -40,7 +34,6 @@ public class AuthService { private final TokenRepository tokenRepository; private final MemberService memberService; private final PasswordEncoder passwordEncoder; - private final JavaMailSender mailSender; @Value("${jwt.refresh-token-expiration-mills}") private long refreshTokenExpirationMillis; @@ -74,58 +67,17 @@ public ResponseEntity signup(SignUpReq request) { throw new BusinessException(ResponseCode.DUPLICATE_EMAIL); } - String authKey = UUID.randomUUID().toString(); - Member newMember = new Member(); newMember.setEmail(request.getEmail()); newMember.setPassword(passwordEncoder.encode(request.getPassword())); newMember.setNickname(request.getNickname()); newMember.setRole(Role.SEMI_USER.name()); newMember.setIsAgreed(true); - newMember.setAuthKey(authKey); - newMember.setAuthStatus(0); memberService.save(newMember); - - try { - sendVerificationEmail(newMember.getEmail(), authKey); - } catch (Exception e) { - log.error("Failed to send verification email", e); - throw new BusinessException(ResponseCode.EMAIL_SEND_FAILED); - } return null; } - private void sendVerificationEmail(String email, String authKey) throws Exception { - MimeMessage message = mailSender.createMimeMessage(); - MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8"); - - helper.setSubject("[PlanIt] 회원가입 인증 메일입니다."); - helper.setTo(email); - - String url = "http://localhost:8080/api/auth/confirm-email?email=" + email + "&authKey=" + authKey; - - String htmlContent = "

회원가입을 완료하려면 아래 링크를 클릭하세요.

" - + "

인증 링크: 이메일 인증하기

"; - - helper.setText(htmlContent, true); - - mailSender.send(message); - } - - @Transactional - public void confirmEmail(String email, String authKey) throws AuthenticationException { - Member member = memberService.findByEmail(email); - - if (member.getAuthStatus() == 1) { - log.warn("Email already verified: {}", email); - return; - } - - member.setAuthStatus(1); - memberService.update(member); - } - public String reissueAccessToken(String refreshToken) { if (!jwtTokenProvider.validateToken(refreshToken)) { throw new BadCredentialsException("Invalid refresh token"); diff --git a/src/main/resources/mapper/MemberMapper.xml b/src/main/resources/mapper/MemberMapper.xml index c07983ed..5c6a23a1 100644 --- a/src/main/resources/mapper/MemberMapper.xml +++ b/src/main/resources/mapper/MemberMapper.xml @@ -70,10 +70,10 @@ INSERT INTO member ( role, connected_id, reward_cnt, social_id, auth_vender, - invest_type, last_visit, email, password, benefit, nickname, auth_key, auth_status + invest_type, last_visit, email, password, benefit, nickname ) VALUES ( #{role}, #{connectedId}, #{rewardCnt}, #{socialId}, #{authVender}, - #{investType}, #{lastVisit}, #{email}, #{password}, #{benefit}, #{nickname}, #{authKey}, 0 + #{investType}, #{lastVisit}, #{email}, #{password}, #{benefit}, #{nickname} ) @@ -89,9 +89,8 @@ email = #{email}, password = #{password}, benefit = #{benefit}, - nickname = #{nickname}, - auth_status = 1 - WHERE member_id = #{memberId} AND auth_key = #{authKey} + nickname = #{nickname} + WHERE member_id = #{memberId}