From 2bfbc7c670d3a2f8911e8baa096252c8888407c8 Mon Sep 17 00:00:00 2001 From: seungyeonnnnnni Date: Tue, 7 Nov 2023 02:48:56 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat=20:=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20?= =?UTF-8?q?=EC=9D=B8=EC=A6=9D=20=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 6 +- build.gradle | 3 + build/resources/main/application.yml | 81 ------------------ .../compileJava/previous-compilation-data.bin | Bin 133482 -> 0 bytes .../dto/request/CheckEmailRequest.java | 15 ++++ .../dto/response/CheckEmailResponse.java | 14 +++ .../service/CheckEmailUserCase.java | 77 +++++++++++++++++ .../application/service/SignUpUserCase.java | 1 + .../auth/exception/EmailAuthException.java | 12 +++ .../auth/presentation/AuthController.java | 16 +++- .../constant/AuthResponseMessage.java | 2 + .../domain/service/MemberCheckService.java | 4 +- .../server/global/config/EmailConfig.java | 68 +++++++++++++++ .../server/global/response/ErrorCode.java | 4 +- .../global/security/SecurityConfig.java | 26 +++--- .../global/security/jwt/redis/RedisUtil.java | 17 ++++ .../security/jwt/service/TokenUtil.java | 2 +- .../server/global/utils/EmailUtil.java | 50 +++++++++++ src/main/resources/application.yml | 81 ------------------ 19 files changed, 296 insertions(+), 183 deletions(-) delete mode 100644 build/resources/main/application.yml delete mode 100644 build/tmp/compileJava/previous-compilation-data.bin create mode 100644 src/main/java/gwangjang/server/domain/auth/application/dto/request/CheckEmailRequest.java create mode 100644 src/main/java/gwangjang/server/domain/auth/application/dto/response/CheckEmailResponse.java create mode 100644 src/main/java/gwangjang/server/domain/auth/application/service/CheckEmailUserCase.java create mode 100644 src/main/java/gwangjang/server/domain/auth/exception/EmailAuthException.java create mode 100644 src/main/java/gwangjang/server/global/config/EmailConfig.java create mode 100644 src/main/java/gwangjang/server/global/utils/EmailUtil.java delete mode 100644 src/main/resources/application.yml diff --git a/.gitignore b/.gitignore index 36db6e2..c7cff53 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,8 @@ out/ .vscode/ -application.yml \ No newline at end of file +application.yml +build/resources/main/application.yml +build/tmp/compileJava/previous-compilation-data.bin +src/main/resources/application.yml + diff --git a/build.gradle b/build.gradle index ccabee1..538e3ac 100644 --- a/build.gradle +++ b/build.gradle @@ -72,6 +72,9 @@ dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-openfeign:3.1.4' implementation 'org.springframework.boot:spring-boot-starter-data-redis' + implementation 'jakarta.mail:jakarta.mail-api:2.1.2' + implementation 'org.springframework.boot:spring-boot-starter-mail' + } diff --git a/build/resources/main/application.yml b/build/resources/main/application.yml deleted file mode 100644 index a0bfa35..0000000 --- a/build/resources/main/application.yml +++ /dev/null @@ -1,81 +0,0 @@ -server: - port: 8083 - -spring: - application: - name: MemberService - - h2: - console: - enabled: true - -# main: -# allow-bean-definition-overriding: true - - - - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://gwangjang.cnzf7npwk5iz.ap-northeast-2.rds.amazonaws.com:3306/member?autoReconnection=true;sendStringParametersAsUnicode=false?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8 - - hikari: - pool-name: jpa-hikari-pool - maximum-pool-size: 5 - jdbc-url: jdbc:mysql://gwangjang.cnzf7npwk5iz.ap-northeast-2.rds.amazonaws.com:3306/member?autoReconnection=true;sendStringParametersAsUnicode=false?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8 - username: admin - password: helloworld - driver-class-name: com.mysql.cj.jdbc.Driver - data-source-properties: - rewriteBatchedStatements: true - - jpa: - database: mysql - hibernate: # hibernate 사용 설정 - - # 애플리케이션 실행 시점에 테이블을 다 지우고, 내가 가진 entity 정보를 보고 다시 테이블 자동 생성 - ddl-auto: update - generate-ddl: true - properties: # property 사용 설정 - hibernate: # hibernate property 설정 - format_sql: true - use_sql_comments: true - show-sql: false - open-in-view: true - - data: - redis: - port: 6379 - host: gwangjang.36k9ap.ng.0001.apn2.cache.amazonaws.com - - -eureka: - client: - register-with-eureka: true - fetch-registry: true - service-url: - defaultZone: http://localhost:8761/eureka - instance: - instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}} - -logging: - level: - com.example.memberservice: DEBUG - -kakao: - client: - id: c1b38a40e2bba2be6a4fd18a38179d5f - redirect-uri: http://localhost:8888/member/auth - token-uri: https://kauth.kakao.com/oauth/token - secret: ZkcLZF7NVt2h45ip2zXxj6QaRJisKeSu - -app-id: #수정해야함 - kakao: 983681 - google: --- - -jwt: - header: Authorization - secret: 2a10q42lY7Y18xqrFt1qbODZIO4OMTeOxnrCe7tF3n9bazJinVE7VH5Pi - access-token-period: 1800000000000000000 # 30분 (30분 * 60초 * 1000밀리초) - refresh-token-period: 1209600000000 # 14일 (14일 * 24시간 * 60분 * 60초 * 1000밀리초) - reissue-token-period: 2592000000000 # 3일 (3일 * 24시간 * 60분 * 60초 * 1000밀리초) - diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin deleted file mode 100644 index 3005fd4c2b9edf57a5dbd88d6c7cdb0fa0d00717..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133482 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 BUVi`p diff --git a/src/main/java/gwangjang/server/domain/auth/application/dto/request/CheckEmailRequest.java b/src/main/java/gwangjang/server/domain/auth/application/dto/request/CheckEmailRequest.java new file mode 100644 index 0000000..cc31a65 --- /dev/null +++ b/src/main/java/gwangjang/server/domain/auth/application/dto/request/CheckEmailRequest.java @@ -0,0 +1,15 @@ +package gwangjang.server.domain.auth.application.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Getter +public class CheckEmailRequest { + String email; + String code; +} diff --git a/src/main/java/gwangjang/server/domain/auth/application/dto/response/CheckEmailResponse.java b/src/main/java/gwangjang/server/domain/auth/application/dto/response/CheckEmailResponse.java new file mode 100644 index 0000000..b8dbe5d --- /dev/null +++ b/src/main/java/gwangjang/server/domain/auth/application/dto/response/CheckEmailResponse.java @@ -0,0 +1,14 @@ +package gwangjang.server.domain.auth.application.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Getter +public class CheckEmailResponse { + private Boolean isChecked; +} diff --git a/src/main/java/gwangjang/server/domain/auth/application/service/CheckEmailUserCase.java b/src/main/java/gwangjang/server/domain/auth/application/service/CheckEmailUserCase.java new file mode 100644 index 0000000..cd12426 --- /dev/null +++ b/src/main/java/gwangjang/server/domain/auth/application/service/CheckEmailUserCase.java @@ -0,0 +1,77 @@ +package gwangjang.server.domain.auth.application.service; + +import gwangjang.server.domain.auth.application.dto.request.CheckEmailRequest; +import gwangjang.server.domain.auth.application.dto.response.CheckEmailResponse; +import gwangjang.server.domain.auth.application.dto.response.CheckNicknameResponse; +import gwangjang.server.domain.auth.exception.EmailAuthException; +import gwangjang.server.domain.member.domain.service.MemberCheckService; +import gwangjang.server.global.security.jwt.redis.RedisUtil; +import gwangjang.server.global.utils.EmailUtil; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.stereotype.Service; + +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Random; + +@Slf4j +@Service +@Transactional +@RequiredArgsConstructor +public class CheckEmailUserCase { + + private final MemberCheckService memberCheckService; + + private final EmailUtil emailUtil; + private final RedisUtil redisUtil; + + private static final String AUTH_CODE_PREFIX = "AuthCode "; + + + public CheckEmailResponse requestEmail(String email){ + boolean isDuplicated=memberCheckService.checkEmail(email); + + if (!isDuplicated) { + log.info("createCode Before"); + String code = createCode(); + log.info("sendEmail Before"); + emailUtil.sendEmail(email,"광장 이메일 인증","인증번호 : "+code); + redisUtil.save(code,email); + log.info("code"+code); + } + return new CheckEmailResponse(isDuplicated); + } + + + public CheckEmailResponse checkEmailAuth(CheckEmailRequest checkEmailRequest) { + + return verifiedCode(checkEmailRequest.getEmail(), checkEmailRequest.getCode()); + } + + private String createCode() { + int lenth = 6; + try { + Random random = SecureRandom.getInstanceStrong(); + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < lenth; i++) { + builder.append(random.nextInt(10)); + } + return builder.toString(); + } catch (NoSuchAlgorithmException e) { + log.debug("MemberService.createCode() exception occur"); + throw new EmailAuthException(); + } + } + + public CheckEmailResponse verifiedCode(String email, String authCode) { + String redisAuthCode = redisUtil.getEmailValues (email).get().toString(); + log.info(String.valueOf(redisUtil.checkExistsValue(redisAuthCode))+"checkExistsValue"); + log.info(String.valueOf(redisAuthCode.equals(authCode))+"redisauthCodeEquals"); + boolean authResult = redisUtil.checkExistsValue(redisAuthCode) && redisAuthCode.equals(authCode); + return new CheckEmailResponse(authResult); + } +} diff --git a/src/main/java/gwangjang/server/domain/auth/application/service/SignUpUserCase.java b/src/main/java/gwangjang/server/domain/auth/application/service/SignUpUserCase.java index fd4d4bc..edcaf23 100644 --- a/src/main/java/gwangjang/server/domain/auth/application/service/SignUpUserCase.java +++ b/src/main/java/gwangjang/server/domain/auth/application/service/SignUpUserCase.java @@ -74,4 +74,5 @@ public SignInResponse localSignUp(LocalSignUpRequest localSignUpRequest) { return SignInResponse.from(tokenResponse, member.getRegistrationStatus()); } + } diff --git a/src/main/java/gwangjang/server/domain/auth/exception/EmailAuthException.java b/src/main/java/gwangjang/server/domain/auth/exception/EmailAuthException.java new file mode 100644 index 0000000..54ebf65 --- /dev/null +++ b/src/main/java/gwangjang/server/domain/auth/exception/EmailAuthException.java @@ -0,0 +1,12 @@ +package gwangjang.server.domain.auth.exception; + +import gwangjang.server.global.response.ErrorCode; +import org.springframework.http.HttpStatus; + +public class EmailAuthException extends AuthException { + public EmailAuthException() { + super(ErrorCode.EMAIL_AUTH_ERROR, + HttpStatus.UNAUTHORIZED); + } +} + diff --git a/src/main/java/gwangjang/server/domain/auth/presentation/AuthController.java b/src/main/java/gwangjang/server/domain/auth/presentation/AuthController.java index 0262c61..63e68f8 100644 --- a/src/main/java/gwangjang/server/domain/auth/presentation/AuthController.java +++ b/src/main/java/gwangjang/server/domain/auth/presentation/AuthController.java @@ -1,13 +1,11 @@ package gwangjang.server.domain.auth.presentation; import gwangjang.server.domain.auth.application.dto.request.*; +import gwangjang.server.domain.auth.application.dto.response.CheckEmailResponse; import gwangjang.server.domain.auth.application.dto.response.CheckNicknameResponse; import gwangjang.server.domain.auth.application.dto.response.ReissueTokenResponse; import gwangjang.server.domain.auth.application.dto.response.SignInResponse; -import gwangjang.server.domain.auth.application.service.CheckNicknameUserCase; -import gwangjang.server.domain.auth.application.service.ReissueTokenUserCase; -import gwangjang.server.domain.auth.application.service.SignInUserCase; -import gwangjang.server.domain.auth.application.service.SignUpUserCase; +import gwangjang.server.domain.auth.application.service.*; import gwangjang.server.domain.auth.application.service.kakao.KakaoTokenUserCase; import gwangjang.server.global.response.SuccessResponse; import gwangjang.server.global.security.dto.User; @@ -35,6 +33,7 @@ public class AuthController { private final ReissueTokenUserCase reissueTokenService; private final CheckNicknameUserCase checkNicknameService; private final KakaoTokenUserCase kakaoTokenUserCase; + private final CheckEmailUserCase checkEmailUserCase; @@ -98,5 +97,14 @@ public ResponseEntity> kakaoCallBack(@RequestParam Strin return ResponseEntity.ok(SuccessResponse.create(KAKAO_CALL_BACK_SUCCESS.getMessage(),kakaoTokenUserCase.getAccessToken(code).getAccess_token())); } + @PostMapping("/email/{email}") + public ResponseEntity> sendEmailAuth(@PathVariable String email){ + return ResponseEntity.ok(SuccessResponse.create(CHECK_EMAIL_SUCCESS.getMessage(),checkEmailUserCase.requestEmail(email))); + } + @PostMapping("/email") + public ResponseEntity> checkEmailAuth(@RequestBody CheckEmailRequest checkEmailRequest){ + return ResponseEntity.ok(SuccessResponse.create(CHECK_EMAIL_AUTH_SUCCESS.getMessage(),checkEmailUserCase.checkEmailAuth(checkEmailRequest))); + } + } \ No newline at end of file diff --git a/src/main/java/gwangjang/server/domain/auth/presentation/constant/AuthResponseMessage.java b/src/main/java/gwangjang/server/domain/auth/presentation/constant/AuthResponseMessage.java index 6c999db..3bbd889 100644 --- a/src/main/java/gwangjang/server/domain/auth/presentation/constant/AuthResponseMessage.java +++ b/src/main/java/gwangjang/server/domain/auth/presentation/constant/AuthResponseMessage.java @@ -10,6 +10,8 @@ public enum AuthResponseMessage { SIGN_UP_SUCCESS("회원 가입을 했습니다"), REISSUE_TOKEN_SUCCESS("토큰을 재발급했습니다"), CHECK_NICKNAME_SUCCESS("닉네임 중복검사를 했습니다"), + CHECK_EMAIL_SUCCESS("이메일 인증을 요청 했습니다"), + CHECK_EMAIL_AUTH_SUCCESS("이메일 인증을 성공 했습니다"), KAKAO_CALL_BACK_SUCCESS("카카오 리다이렉트를 완료 했습니다"); private final String message; } diff --git a/src/main/java/gwangjang/server/domain/member/domain/service/MemberCheckService.java b/src/main/java/gwangjang/server/domain/member/domain/service/MemberCheckService.java index 58db3b9..7476500 100644 --- a/src/main/java/gwangjang/server/domain/member/domain/service/MemberCheckService.java +++ b/src/main/java/gwangjang/server/domain/member/domain/service/MemberCheckService.java @@ -4,8 +4,9 @@ import gwangjang.server.global.annotation.DomainService; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; - +@Slf4j @DomainService @Transactional @RequiredArgsConstructor @@ -15,6 +16,7 @@ public boolean checkNickname(String nickname) { return memberRepository.checkNickname(nickname); } public boolean checkEmail(String email) { + log.info("checkEmail done"); return memberRepository.checkEmail(email); } diff --git a/src/main/java/gwangjang/server/global/config/EmailConfig.java b/src/main/java/gwangjang/server/global/config/EmailConfig.java new file mode 100644 index 0000000..f7cb38e --- /dev/null +++ b/src/main/java/gwangjang/server/global/config/EmailConfig.java @@ -0,0 +1,68 @@ +package gwangjang.server.global.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.JavaMailSenderImpl; + +import java.util.Properties; + +@Configuration +public class EmailConfig { + + @Value("${spring.mail.host}") + private String host; + + @Value("${spring.mail.port}") + private int port; + + @Value("${spring.mail.username}") + private String username; + + @Value("${spring.mail.password}") + private String password; + + @Value("${spring.mail.properties.mail.smtp.auth}") + private boolean auth; + + @Value("${spring.mail.properties.mail.smtp.starttls.enable}") + private boolean starttlsEnable; + + @Value("${spring.mail.properties.mail.smtp.starttls.required}") + private boolean starttlsRequired; + + @Value("${spring.mail.properties.mail.smtp.connectiontimeout}") + private int connectionTimeout; + + @Value("${spring.mail.properties.mail.smtp.timeout}") + private int timeout; + + @Value("${spring.mail.properties.mail.smtp.writetimeout}") + private int writeTimeout; + + @Bean + public JavaMailSender javaMailSender() { + JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); + mailSender.setHost(host); + mailSender.setPort(port); + mailSender.setUsername(username); + mailSender.setPassword(password); + mailSender.setDefaultEncoding("UTF-8"); + mailSender.setJavaMailProperties(getMailProperties()); + + return mailSender; + } + + private Properties getMailProperties() { + Properties properties = new Properties(); + properties.put("mail.smtp.auth", auth); + properties.put("mail.smtp.starttls.enable", starttlsEnable); + properties.put("mail.smtp.starttls.required", starttlsRequired); + properties.put("mail.smtp.connectiontimeout", connectionTimeout); + properties.put("mail.smtp.timeout", timeout); + properties.put("mail.smtp.writetimeout", writeTimeout); + + return properties; + } +} diff --git a/src/main/java/gwangjang/server/global/response/ErrorCode.java b/src/main/java/gwangjang/server/global/response/ErrorCode.java index db89ec2..d7eb3be 100644 --- a/src/main/java/gwangjang/server/global/response/ErrorCode.java +++ b/src/main/java/gwangjang/server/global/response/ErrorCode.java @@ -23,7 +23,9 @@ public enum ErrorCode { TOKEN_INVALID_ERROR("AU0002", "입력 토큰이 유효하지 않습니다."), APPID_INVALID_ERROR("AU0003", "appId가 유효하지 않습니다"), NICKNAME_DUPLICATION_ERROR("AU0004", "닉네임이 중복됩니다."), - EMAIL_DUPLICATION_ERROR("AU0005", "닉네임이 중복됩니다."), + EMAIL_DUPLICATION_ERROR("AU0005", "이메일이 중복됩니다."), + EMAIL_AUTH_ERROR("AU0005", "이메일이 중복됩니다."), + NOT_FOUND_BY_LOGIN_ID_ERROR("L001","해당 id인 유저가 존재하지 않습니다"), INCORRECT_PASSWORD("L002","비밀번호가 틀렸습니다"); diff --git a/src/main/java/gwangjang/server/global/security/SecurityConfig.java b/src/main/java/gwangjang/server/global/security/SecurityConfig.java index fc62f32..8c08c89 100644 --- a/src/main/java/gwangjang/server/global/security/SecurityConfig.java +++ b/src/main/java/gwangjang/server/global/security/SecurityConfig.java @@ -70,18 +70,18 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { return http.build(); } - @Bean - public CorsConfigurationSource corsConfigurationSource() { - CorsConfiguration configuration = new CorsConfiguration(); - - configuration.addAllowedOriginPattern("*"); - configuration.addAllowedHeader("*"); - configuration.addAllowedMethod("*"); - configuration.setAllowCredentials(false); - - UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); - source.registerCorsConfiguration("/**", configuration); - return source; - } +// @Bean +// public CorsConfigurationSource corsConfigurationSource() { +// CorsConfiguration configuration = new CorsConfiguration(); +// +// configuration.addAllowedOriginPattern("*"); +// configuration.addAllowedHeader("*"); +// configuration.addAllowedMethod("*"); +// configuration.setAllowCredentials(false); +// +// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); +// source.registerCorsConfiguration("/**", configuration); +// return source; +// } } \ No newline at end of file diff --git a/src/main/java/gwangjang/server/global/security/jwt/redis/RedisUtil.java b/src/main/java/gwangjang/server/global/security/jwt/redis/RedisUtil.java index 52969f7..31d21f3 100644 --- a/src/main/java/gwangjang/server/global/security/jwt/redis/RedisUtil.java +++ b/src/main/java/gwangjang/server/global/security/jwt/redis/RedisUtil.java @@ -1,5 +1,6 @@ package gwangjang.server.global.security.jwt.redis; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Repository; @@ -7,6 +8,7 @@ import java.util.Optional; import java.util.concurrent.TimeUnit; +@Slf4j @Repository public class RedisUtil { @@ -20,6 +22,7 @@ public RedisUtil(final RedisTemplate redisTemplate) { } public void save(String refreshToken, String socialId) { + log.info("save redis"); //동일한 key 값으로 저장하면 value값 updat됨 redisTemplate.opsForValue().set(socialId, refreshToken, refreshTokenValidityTime, TimeUnit.SECONDS); } @@ -32,4 +35,18 @@ public Optional findById(final String socialId) { String refreshToken = (String) redisTemplate.opsForValue().get(socialId); return Optional.ofNullable(refreshToken); } + + public Optional getEmailValues(String value) { + String check = (String) redisTemplate.opsForValue().get(value); + log.info("chek"+check); + return Optional.ofNullable(check); + } + + public boolean checkExistsValue(String key) { + String value = (String) redisTemplate.opsForValue().get(key); + log.info("value"+value); + return value == null; + } + + } diff --git a/src/main/java/gwangjang/server/global/security/jwt/service/TokenUtil.java b/src/main/java/gwangjang/server/global/security/jwt/service/TokenUtil.java index 58cd347..7e31082 100644 --- a/src/main/java/gwangjang/server/global/security/jwt/service/TokenUtil.java +++ b/src/main/java/gwangjang/server/global/security/jwt/service/TokenUtil.java @@ -107,7 +107,7 @@ public boolean verifyToken(String token) { //refresh token 관련 public void storeRefreshToken(String socialId, TokenInfoResponse token) { -// redisUtil.save(token.getRefreshToken(), socialId); + redisUtil.save(token.getRefreshToken(), socialId); } public TokenInfoResponse tokenReissue(String token) { diff --git a/src/main/java/gwangjang/server/global/utils/EmailUtil.java b/src/main/java/gwangjang/server/global/utils/EmailUtil.java new file mode 100644 index 0000000..1178622 --- /dev/null +++ b/src/main/java/gwangjang/server/global/utils/EmailUtil.java @@ -0,0 +1,50 @@ +package gwangjang.server.global.utils; + +import gwangjang.server.domain.auth.exception.EmailAuthException; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; + +@Slf4j +@Transactional +@RequiredArgsConstructor +@Component +public class EmailUtil { + + private final JavaMailSender emailSender; + + public void sendEmail(String toEmail, + String title, + String text) { + SimpleMailMessage emailForm = createEmailForm(toEmail, title, text); +// try { + log.info("email send before"); + emailSender.send(emailForm); + log.info("email send after"); + +// } catch (RuntimeException e) { + log.info("MailService.sendEmail exception occur toEmail: {}, " + + "title: {}, text: {}", toEmail, title, text); +// throw new EmailAuthException(); +// } + } + + // 발신할 이메일 데이터 세팅 + private SimpleMailMessage createEmailForm(String toEmail, + String title, + String text) { + SimpleMailMessage message = new SimpleMailMessage(); + message.setTo(toEmail); + message.setSubject(title); + message.setText(text); + + return message; + } + + +} + diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml deleted file mode 100644 index a0bfa35..0000000 --- a/src/main/resources/application.yml +++ /dev/null @@ -1,81 +0,0 @@ -server: - port: 8083 - -spring: - application: - name: MemberService - - h2: - console: - enabled: true - -# main: -# allow-bean-definition-overriding: true - - - - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://gwangjang.cnzf7npwk5iz.ap-northeast-2.rds.amazonaws.com:3306/member?autoReconnection=true;sendStringParametersAsUnicode=false?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8 - - hikari: - pool-name: jpa-hikari-pool - maximum-pool-size: 5 - jdbc-url: jdbc:mysql://gwangjang.cnzf7npwk5iz.ap-northeast-2.rds.amazonaws.com:3306/member?autoReconnection=true;sendStringParametersAsUnicode=false?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8 - username: admin - password: helloworld - driver-class-name: com.mysql.cj.jdbc.Driver - data-source-properties: - rewriteBatchedStatements: true - - jpa: - database: mysql - hibernate: # hibernate 사용 설정 - - # 애플리케이션 실행 시점에 테이블을 다 지우고, 내가 가진 entity 정보를 보고 다시 테이블 자동 생성 - ddl-auto: update - generate-ddl: true - properties: # property 사용 설정 - hibernate: # hibernate property 설정 - format_sql: true - use_sql_comments: true - show-sql: false - open-in-view: true - - data: - redis: - port: 6379 - host: gwangjang.36k9ap.ng.0001.apn2.cache.amazonaws.com - - -eureka: - client: - register-with-eureka: true - fetch-registry: true - service-url: - defaultZone: http://localhost:8761/eureka - instance: - instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}} - -logging: - level: - com.example.memberservice: DEBUG - -kakao: - client: - id: c1b38a40e2bba2be6a4fd18a38179d5f - redirect-uri: http://localhost:8888/member/auth - token-uri: https://kauth.kakao.com/oauth/token - secret: ZkcLZF7NVt2h45ip2zXxj6QaRJisKeSu - -app-id: #수정해야함 - kakao: 983681 - google: --- - -jwt: - header: Authorization - secret: 2a10q42lY7Y18xqrFt1qbODZIO4OMTeOxnrCe7tF3n9bazJinVE7VH5Pi - access-token-period: 1800000000000000000 # 30분 (30분 * 60초 * 1000밀리초) - refresh-token-period: 1209600000000 # 14일 (14일 * 24시간 * 60분 * 60초 * 1000밀리초) - reissue-token-period: 2592000000000 # 3일 (3일 * 24시간 * 60분 * 60초 * 1000밀리초) - From e23a173b21bc1537a175d6ba4f8433c8f7dba692 Mon Sep 17 00:00:00 2001 From: seungyeonnnnnni Date: Tue, 7 Nov 2023 04:10:34 +0900 Subject: [PATCH 2/3] feat : req type application/json -> x-www-form-urlencoded --- .../dto/request/CheckEmailRequest.java | 6 ++-- .../dto/request/LocalSignInRequest.java | 5 ++++ .../dto/request/LocalSignUpRequest.java | 7 ++--- .../dto/request/SignInRequest.java | 6 ++-- .../dto/request/SignUpRequest.java | 6 ++-- .../application/dto/request/TestRequest.java | 6 ++-- .../auth/presentation/AuthController.java | 19 ++++++------- .../presentation/AuthRedirectController.java | 28 ------------------- 8 files changed, 25 insertions(+), 58 deletions(-) delete mode 100644 src/main/java/gwangjang/server/domain/auth/presentation/AuthRedirectController.java diff --git a/src/main/java/gwangjang/server/domain/auth/application/dto/request/CheckEmailRequest.java b/src/main/java/gwangjang/server/domain/auth/application/dto/request/CheckEmailRequest.java index cc31a65..8d6aad2 100644 --- a/src/main/java/gwangjang/server/domain/auth/application/dto/request/CheckEmailRequest.java +++ b/src/main/java/gwangjang/server/domain/auth/application/dto/request/CheckEmailRequest.java @@ -1,14 +1,12 @@ package gwangjang.server.domain.auth.application.dto.request; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; @NoArgsConstructor @AllArgsConstructor @Builder @Getter +@Setter public class CheckEmailRequest { String email; String code; diff --git a/src/main/java/gwangjang/server/domain/auth/application/dto/request/LocalSignInRequest.java b/src/main/java/gwangjang/server/domain/auth/application/dto/request/LocalSignInRequest.java index 8f47dd9..3b6a5d2 100644 --- a/src/main/java/gwangjang/server/domain/auth/application/dto/request/LocalSignInRequest.java +++ b/src/main/java/gwangjang/server/domain/auth/application/dto/request/LocalSignInRequest.java @@ -1,11 +1,16 @@ package gwangjang.server.domain.auth.application.dto.request; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; +@Setter @Getter @NoArgsConstructor +@AllArgsConstructor public class LocalSignInRequest { private String id; private String pw; + } diff --git a/src/main/java/gwangjang/server/domain/auth/application/dto/request/LocalSignUpRequest.java b/src/main/java/gwangjang/server/domain/auth/application/dto/request/LocalSignUpRequest.java index 1d8c2ab..f02b530 100644 --- a/src/main/java/gwangjang/server/domain/auth/application/dto/request/LocalSignUpRequest.java +++ b/src/main/java/gwangjang/server/domain/auth/application/dto/request/LocalSignUpRequest.java @@ -2,11 +2,10 @@ import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.fasterxml.jackson.databind.annotation.JsonNaming; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; -@Data +@Getter +@Setter @NoArgsConstructor @AllArgsConstructor public class LocalSignUpRequest { diff --git a/src/main/java/gwangjang/server/domain/auth/application/dto/request/SignInRequest.java b/src/main/java/gwangjang/server/domain/auth/application/dto/request/SignInRequest.java index 7e4d421..1576f14 100644 --- a/src/main/java/gwangjang/server/domain/auth/application/dto/request/SignInRequest.java +++ b/src/main/java/gwangjang/server/domain/auth/application/dto/request/SignInRequest.java @@ -1,16 +1,14 @@ package gwangjang.server.domain.auth.application.dto.request; import jakarta.validation.constraints.NotBlank; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; @Builder @AllArgsConstructor @NoArgsConstructor @Getter +@Setter public class SignInRequest { @NotBlank(message="token 을 입력해주세요.") private String token; diff --git a/src/main/java/gwangjang/server/domain/auth/application/dto/request/SignUpRequest.java b/src/main/java/gwangjang/server/domain/auth/application/dto/request/SignUpRequest.java index 73ee34f..f7e6730 100644 --- a/src/main/java/gwangjang/server/domain/auth/application/dto/request/SignUpRequest.java +++ b/src/main/java/gwangjang/server/domain/auth/application/dto/request/SignUpRequest.java @@ -3,16 +3,14 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; @Builder @AllArgsConstructor @NoArgsConstructor @Getter +@Setter public class SignUpRequest { diff --git a/src/main/java/gwangjang/server/domain/auth/application/dto/request/TestRequest.java b/src/main/java/gwangjang/server/domain/auth/application/dto/request/TestRequest.java index 3834b45..d912369 100644 --- a/src/main/java/gwangjang/server/domain/auth/application/dto/request/TestRequest.java +++ b/src/main/java/gwangjang/server/domain/auth/application/dto/request/TestRequest.java @@ -1,14 +1,12 @@ package gwangjang.server.domain.auth.application.dto.request; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; @Builder @AllArgsConstructor @NoArgsConstructor @Getter +@Setter public class TestRequest { private String socialId; diff --git a/src/main/java/gwangjang/server/domain/auth/presentation/AuthController.java b/src/main/java/gwangjang/server/domain/auth/presentation/AuthController.java index 63e68f8..039cdc9 100644 --- a/src/main/java/gwangjang/server/domain/auth/presentation/AuthController.java +++ b/src/main/java/gwangjang/server/domain/auth/presentation/AuthController.java @@ -12,6 +12,7 @@ import jakarta.validation.Valid; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.parameters.P; @@ -22,7 +23,7 @@ @RestController @AllArgsConstructor -@RequestMapping("/auth") +@RequestMapping(value = "/auth",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) @Slf4j public class AuthController { @@ -38,14 +39,13 @@ public class AuthController { @PostMapping("/signIn") - public ResponseEntity> signIn( - @Valid @RequestBody LocalSignInRequest localSignInRequest) { + public ResponseEntity> signIn(LocalSignInRequest localSignInRequest) { return ResponseEntity.ok(SuccessResponse.create(SIGN_IN_SUCCESS.getMessage(), this.authService.localSignIn(localSignInRequest))); } @PostMapping("/signIn/{provider}") public ResponseEntity> socialSignIn(@PathVariable String provider, - @Valid @RequestBody SignInRequest signInRequest) { + SignInRequest signInRequest) { return ResponseEntity.ok(SuccessResponse.create(SIGN_IN_SUCCESS.getMessage(), this.authService.signIn(signInRequest.getToken(), provider))); } @@ -53,13 +53,13 @@ public ResponseEntity> socialSignIn(@PathVariabl @PutMapping("/signUp/{provider}") public ResponseEntity> socialSignUp(@PathVariable String provider, @RequestHeader(value = "Authorization") String token, - @Valid @RequestBody SignUpRequest signUpRequest) { + SignUpRequest signUpRequest) { token = (token != null && token.startsWith("Bearer ")) ? token.substring(7) : token; return ResponseEntity.ok(SuccessResponse.create(SIGN_UP_SUCCESS.getMessage(), this.signUpService.signUp(token, signUpRequest))); } @PostMapping("/signUp") - public ResponseEntity> signUp(@Valid @RequestBody LocalSignUpRequest signUpRequest) { + public ResponseEntity> signUp(LocalSignUpRequest signUpRequest) { return ResponseEntity.ok(SuccessResponse.create(SIGN_UP_SUCCESS.getMessage(), this.signUpService.localSignUp(signUpRequest))); } @@ -78,13 +78,12 @@ public ResponseEntity> checkNickname(@Pat @PostMapping("/test/{provider}") public ResponseEntity> testLogin(@PathVariable String provider, - @RequestBody TestRequest testRequest){ + TestRequest testRequest){ return ResponseEntity.ok(SuccessResponse.create(SIGN_IN_SUCCESS.getMessage(), this.authService.testSignIn(testRequest.getSocialId(),provider))); } @PostMapping("/test/hi") - public ResponseEntity> test(@AuthenticationPrincipal User user - ){ + public ResponseEntity> test(@AuthenticationPrincipal User user){ log.info("/test/hi -> start "); log.info(user.getEmail()); @@ -102,7 +101,7 @@ public ResponseEntity> sendEmailAuth(@PathVa return ResponseEntity.ok(SuccessResponse.create(CHECK_EMAIL_SUCCESS.getMessage(),checkEmailUserCase.requestEmail(email))); } @PostMapping("/email") - public ResponseEntity> checkEmailAuth(@RequestBody CheckEmailRequest checkEmailRequest){ + public ResponseEntity> checkEmailAuth(CheckEmailRequest checkEmailRequest){ return ResponseEntity.ok(SuccessResponse.create(CHECK_EMAIL_AUTH_SUCCESS.getMessage(),checkEmailUserCase.checkEmailAuth(checkEmailRequest))); } diff --git a/src/main/java/gwangjang/server/domain/auth/presentation/AuthRedirectController.java b/src/main/java/gwangjang/server/domain/auth/presentation/AuthRedirectController.java deleted file mode 100644 index aee00e9..0000000 --- a/src/main/java/gwangjang/server/domain/auth/presentation/AuthRedirectController.java +++ /dev/null @@ -1,28 +0,0 @@ -package gwangjang.server.domain.auth.presentation; - -//@RestController -//@AllArgsConstructor -//public class AuthRedirectController { -// @Value("${android.package}") -// private String androidPackage; -// -// @Value("${android.scheme}") -// private String androidScheme; -// -// /** -// * 애플 로그인 리다이렉트 -// */ -// @CrossOrigin(origins = "https://appleid.apple.com") -// @PostMapping(value = "/auth/apple/callback", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) -// public ResponseEntity userLoginAppleCallback(@RequestParam("code") String code, -// @RequestParam("id_token") String idToken) throws URISyntaxException { -// // Deep link 생성 -// String callback = String.format("intent://callback?code=%s&id_token=%s#Intent;package=%s;scheme=%s;end", -// code, idToken, androidPackage, androidScheme); -// -// // 리다이렉트 -// HttpHeaders httpHeaders = new HttpHeaders(); -// httpHeaders.setLocation(new URI(callback)); -// return new ResponseEntity<>(httpHeaders, HttpStatus.TEMPORARY_REDIRECT); -// } -//} From 163cba67338a1d49055d791cd9ef5649e767a075 Mon Sep 17 00:00:00 2001 From: seungyeonnnnnni Date: Tue, 7 Nov 2023 04:42:06 +0900 Subject: [PATCH 3/3] feat : cors error --- .../server/domain/auth/presentation/AuthController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/gwangjang/server/domain/auth/presentation/AuthController.java b/src/main/java/gwangjang/server/domain/auth/presentation/AuthController.java index 039cdc9..6a57b77 100644 --- a/src/main/java/gwangjang/server/domain/auth/presentation/AuthController.java +++ b/src/main/java/gwangjang/server/domain/auth/presentation/AuthController.java @@ -23,6 +23,7 @@ @RestController @AllArgsConstructor +@CrossOrigin(origins = "*") @RequestMapping(value = "/auth",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) @Slf4j public class AuthController { @@ -100,6 +101,7 @@ public ResponseEntity> kakaoCallBack(@RequestParam Strin public ResponseEntity> sendEmailAuth(@PathVariable String email){ return ResponseEntity.ok(SuccessResponse.create(CHECK_EMAIL_SUCCESS.getMessage(),checkEmailUserCase.requestEmail(email))); } + @PostMapping("/email") public ResponseEntity> checkEmailAuth(CheckEmailRequest checkEmailRequest){ return ResponseEntity.ok(SuccessResponse.create(CHECK_EMAIL_AUTH_SUCCESS.getMessage(),checkEmailUserCase.checkEmailAuth(checkEmailRequest)));