From c764e1da308c6b0fe2977b84e1d46e59d08678a3 Mon Sep 17 00:00:00 2001 From: Choo Date: Thu, 29 Dec 2022 05:49:29 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=C3=A3=C3=AC=EC=95=84=EC=9D=B4?= =?UTF-8?q?=EB=94=94=20=EC=B0=BE=EA=B8=B0=20=C3=AA=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20(#4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/common/exception/ErrorCode.java | 2 + .../backend/email/service/EmailService.java | 2 +- .../email/service/EmailServiceImpl.java | 52 +++++-------------- .../backend/member/service/MemberService.java | 20 ++++--- .../backend/member/web/MemberController.java | 36 +++++++------ .../dto/request/MemberFindIdRequestDto.java | 14 +++++ 6 files changed, 61 insertions(+), 65 deletions(-) create mode 100644 src/main/java/com/sptp/backend/member/web/dto/request/MemberFindIdRequestDto.java diff --git a/src/main/java/com/sptp/backend/common/exception/ErrorCode.java b/src/main/java/com/sptp/backend/common/exception/ErrorCode.java index 9c85fb5f..b7225d9e 100644 --- a/src/main/java/com/sptp/backend/common/exception/ErrorCode.java +++ b/src/main/java/com/sptp/backend/common/exception/ErrorCode.java @@ -17,6 +17,8 @@ public enum ErrorCode { NOT_FOUND_MEMBER(HttpStatus.NOT_FOUND, "해당 유저를 찾을 수 없습니다."), EXIST_MEMBER(HttpStatus.BAD_REQUEST, "이미 등록된 유저입니다."), NOT_MATCH_PASSWORD(HttpStatus.BAD_REQUEST, "패스워드가 일치하지 않습니다."), + NOT_FOUND_EMAIL(HttpStatus.NOT_FOUND, "가입되지 않은 이메일 입니다."), + NOT_MATCH_USERNAME(HttpStatus.BAD_REQUEST, "잘못된 이름입니다."), //토큰 예외 TOKEN_EXPIRED(HttpStatus.UNAUTHORIZED, "토큰이 만료되었습니다."), diff --git a/src/main/java/com/sptp/backend/email/service/EmailService.java b/src/main/java/com/sptp/backend/email/service/EmailService.java index c221fb4e..9a1b6e3d 100644 --- a/src/main/java/com/sptp/backend/email/service/EmailService.java +++ b/src/main/java/com/sptp/backend/email/service/EmailService.java @@ -1,5 +1,5 @@ package com.sptp.backend.email.service; public interface EmailService { - String sendMessage(String to)throws Exception; + void sendMessage(String to)throws Exception; } diff --git a/src/main/java/com/sptp/backend/email/service/EmailServiceImpl.java b/src/main/java/com/sptp/backend/email/service/EmailServiceImpl.java index 4cb5954f..3d295cac 100644 --- a/src/main/java/com/sptp/backend/email/service/EmailServiceImpl.java +++ b/src/main/java/com/sptp/backend/email/service/EmailServiceImpl.java @@ -1,6 +1,8 @@ package com.sptp.backend.email.service; import com.sptp.backend.email.service.EmailService; +import com.sptp.backend.member.repository.Member; +import com.sptp.backend.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.mail.MailException; import org.springframework.mail.javamail.JavaMailSender; @@ -16,12 +18,11 @@ public class EmailServiceImpl implements EmailService { private final JavaMailSender emailSender; + private final MemberRepository memberRepository; - public static final String ePw = createKey(); - - private MimeMessage createMessage(String to)throws Exception{ + private MimeMessage createMessage(String to, String UserId)throws Exception{ System.out.println("보내는 대상 : "+ to); - System.out.println("인증 번호 : "+ePw); + System.out.println("아이디 : "+ UserId); MimeMessage message = emailSender.createMimeMessage(); message.addRecipients(Message.RecipientType.TO, to);//보내는 대상 @@ -31,15 +32,11 @@ private MimeMessage createMessage(String to)throws Exception{ msgg+= "
"; msgg+= "

안녕하세요 Atties입니다.

"; msgg+= "
"; - msgg+= "

아래 코드를 복사해 입력해주세요

"; - msgg+= "
"; - msgg+= "

감사합니다.

"; - msgg+= "
"; msgg+= "

"; - msgg+= "

회원가입 인증 코드입니다.

"; + msgg+= "

아래는 회원님의 아이디입니다.

"; msgg+= "
"; - msgg+= "CODE : "; - msgg+= ePw+"

"; + msgg+= "회원ID : "; + msgg+= UserId+"

"; msgg+= "
"; message.setText(msgg, "utf-8", "html");//내용 message.setFrom(new InternetAddress("sgb8154@gmail.com","limjunho"));//보내는 사람 @@ -47,40 +44,15 @@ private MimeMessage createMessage(String to)throws Exception{ return message; } - public static String createKey() { - StringBuffer key = new StringBuffer(); - Random rnd = new Random(); - - for (int i = 0; i < 8; i++) { // 인증코드 8자리 - int index = rnd.nextInt(3); // 0~2 까지 랜덤 - - switch (index) { - case 0: - key.append((char) ((int) (rnd.nextInt(26)) + 97)); - // a~z (ex. 1+97=98 => (char)98 = 'b') - break; - case 1: - key.append((char) ((int) (rnd.nextInt(26)) + 65)); - // A~Z - break; - case 2: - key.append((rnd.nextInt(10))); - // 0~9 - break; - } - } - return key.toString(); - } @Override - public String sendMessage(String to)throws Exception { - // TODO Auto-generated method stub - MimeMessage message = createMessage(to); - try{//예외처리 + public void sendMessage(String to)throws Exception { + String UserId = memberRepository.findByEmail(to).get().getUserId(); + MimeMessage message = createMessage(to, UserId); + try{ emailSender.send(message); }catch(MailException es){ es.printStackTrace(); throw new IllegalArgumentException(); } - return ePw; } } diff --git a/src/main/java/com/sptp/backend/member/service/MemberService.java b/src/main/java/com/sptp/backend/member/service/MemberService.java index a4c46a1e..e448df81 100644 --- a/src/main/java/com/sptp/backend/member/service/MemberService.java +++ b/src/main/java/com/sptp/backend/member/service/MemberService.java @@ -1,5 +1,6 @@ package com.sptp.backend.member.service; +import com.sptp.backend.member.web.dto.request.MemberFindIdRequestDto; import com.sptp.backend.member.web.dto.request.MemberLoginRequestDto; import com.sptp.backend.member.web.dto.request.MemberSaveRequestDto; import com.sptp.backend.member.repository.Member; @@ -15,8 +16,11 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import java.util.Arrays; import java.util.Collections; +import java.util.List; import java.util.Optional; @Service @@ -59,19 +63,22 @@ public TokenDto login(MemberLoginRequestDto dto) { throw new CustomException(ErrorCode.NOT_MATCH_PASSWORD, "잘못된 비밀번호입니다."); } - TokenDto tokenDto = jwtTokenProvider.createToken(findMember.getUserId(), findMember.getRoles()); jwtService.saveRefreshToken(tokenDto); return tokenDto; } - public Optional findByEmail(String email) { - Optional findUser = memberRepository.findByEmail(email); - if (findUser.isPresent()) { - return findUser; + public Member findByEmail(MemberFindIdRequestDto dto) { + + // 이메일 및 유저이름 유효성 체크 + Member findMember = memberRepository.findByEmail(dto.getEmail()) + .orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_EMAIL)); + if (!dto.getUsername().equals(findMember.getUsername())) { + throw new CustomException(ErrorCode.NOT_MATCH_USERNAME); } - return null; + + return findMember; } public void checkDuplicateMember(String userId) { @@ -87,5 +94,4 @@ public boolean checkDuplicateMemberBoolean(String email) { return false; } } - } diff --git a/src/main/java/com/sptp/backend/member/web/MemberController.java b/src/main/java/com/sptp/backend/member/web/MemberController.java index 9dd3fac2..77f0d33d 100644 --- a/src/main/java/com/sptp/backend/member/web/MemberController.java +++ b/src/main/java/com/sptp/backend/member/web/MemberController.java @@ -1,5 +1,6 @@ package com.sptp.backend.member.web; +import com.sptp.backend.member.web.dto.request.MemberFindIdRequestDto; import com.sptp.backend.jwt.service.JwtService; import com.sptp.backend.member.web.dto.request.MemberLoginRequestDto; import com.sptp.backend.member.web.dto.request.MemberSaveRequestDto; @@ -10,12 +11,17 @@ import com.sptp.backend.email.service.EmailService; import com.sptp.backend.jwt.web.dto.TokenDto; import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; +import java.net.URI; import java.util.HashMap; +import java.util.Optional; import java.util.Map; @RestController @@ -57,7 +63,6 @@ public ResponseEntity login(@RequestBody MemberLoginRequestDto memberLoginReq .build(); return ResponseEntity.status(HttpStatus.OK).body(tokenResponseDto); - } @PostMapping("/members/token") @@ -72,28 +77,25 @@ public ResponseEntity refresh(@RequestHeader("refreshToken") String refreshTo .build(); return ResponseEntity.status(HttpStatus.OK).body(tokenResponseDto); - } + // 아이디 찾기 + @PostMapping("/members/id") + public ResponseEntity findId(@RequestBody MemberFindIdRequestDto memberFindIdRequestDto) { - @PostMapping("/emailConfirm") - public String emailConfirm(@RequestParam String email) throws Exception { + Member member = memberService.findByEmail(memberFindIdRequestDto); - String confirm = emailService.sendMessage(email); - emailMap.put(email, confirm); - return confirm; - } + HttpHeaders headers = new HttpHeaders(); + headers.setLocation(URI.create("/emailId?email=" + member.getEmail())); - @PostMapping("/emailConfirmCheck") - public String emailCheck(@RequestParam String email, @RequestParam String code) { - if (emailMap.get(email).equals(code)) { - emailMap.remove(email); - return "OK"; - }else{ - return "NO"; - } + return new ResponseEntity<>(headers, HttpStatus.MOVED_PERMANENTLY); } + // 이메일로 아이디 발송 + @PostMapping("/emailId") + public ResponseEntity emailConfirm(@RequestParam String email) throws Exception { - + emailService.sendMessage(email); + return new ResponseEntity(HttpStatus.OK); + } } diff --git a/src/main/java/com/sptp/backend/member/web/dto/request/MemberFindIdRequestDto.java b/src/main/java/com/sptp/backend/member/web/dto/request/MemberFindIdRequestDto.java new file mode 100644 index 00000000..1a89466d --- /dev/null +++ b/src/main/java/com/sptp/backend/member/web/dto/request/MemberFindIdRequestDto.java @@ -0,0 +1,14 @@ +package com.sptp.backend.member.web.dto.request; + +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class MemberFindIdRequestDto { + + private String username; + private String email; +} From 63fb78d41b19f7c3735c35e8a94fa2416bf8a47a Mon Sep 17 00:00:00 2001 From: Choo Date: Thu, 29 Dec 2022 10:46:01 +0900 Subject: [PATCH 2/3] =?UTF-8?q?Chore:=20=EB=A9=94=EC=9D=BC=20=EC=86=A1?= =?UTF-8?q?=EC=8B=A0=EC=9E=90=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sptp/backend/email/service/EmailServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/sptp/backend/email/service/EmailServiceImpl.java b/src/main/java/com/sptp/backend/email/service/EmailServiceImpl.java index 3d295cac..2220c17d 100644 --- a/src/main/java/com/sptp/backend/email/service/EmailServiceImpl.java +++ b/src/main/java/com/sptp/backend/email/service/EmailServiceImpl.java @@ -39,7 +39,7 @@ private MimeMessage createMessage(String to, String UserId)throws Exception{ msgg+= UserId+"

"; msgg+= "
"; message.setText(msgg, "utf-8", "html");//내용 - message.setFrom(new InternetAddress("sgb8154@gmail.com","limjunho"));//보내는 사람 + message.setFrom(new InternetAddress("sgb8154@gmail.com","Atties"));//보내는 사람 return message; } From 3b8e91afeed15c2e0e8a1e1be8364333b7f07f09 Mon Sep 17 00:00:00 2001 From: Choo Date: Thu, 29 Dec 2022 13:47:11 +0900 Subject: [PATCH 3/3] =?UTF-8?q?Build:=20=ED=99=98=EA=B2=BD=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- .../backend/common/config/PropertyConfig.java | 12 ++++ src/main/resources/application.yml | 56 +++++++++++++++++++ src/main/resources/email.properties | 11 ++++ 4 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/sptp/backend/common/config/PropertyConfig.java create mode 100644 src/main/resources/application.yml create mode 100644 src/main/resources/email.properties diff --git a/.gitignore b/.gitignore index 0d38ea56..13f7f792 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,4 @@ out/ .vscode/ ##### -application.properties -email.properties -application.yml \ No newline at end of file +env.properties \ No newline at end of file diff --git a/src/main/java/com/sptp/backend/common/config/PropertyConfig.java b/src/main/java/com/sptp/backend/common/config/PropertyConfig.java new file mode 100644 index 00000000..be3b9032 --- /dev/null +++ b/src/main/java/com/sptp/backend/common/config/PropertyConfig.java @@ -0,0 +1,12 @@ +package com.sptp.backend.common.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.context.annotation.PropertySources; + +@Configuration +@PropertySources({ + @PropertySource("classpath:env.properties") // env.properties 파일 소스 등록 +}) +public class PropertyConfig { +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 00000000..18d5a27b --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,56 @@ +spring: + redis: + host: localhost + port: ${application.spring.redis.port} + + datasource: + url: ${application.spring.datasource.url} + username: ${application.spring.datasource.username} + password: ${application.spring.datasource.password} + driver-class-name: com.mysql.cj.jdbc.Driver + + jpa: + hibernate: + ddl-auto: update + properties: + hibernate: + format_sql: true + dialect: org.hibernate.dialect.MySQL5InnoDBDialect + + security: + oauth2: + client: + registration: + kakao: + client-id: ${application.spring.security.kakao.client-id} + client-secret: ${application.spring.security.kakao.client-secret} + redirect-uri: http://localhost:8080/login/oauth2/code/kakao + authorization-grant-type: authorization_code + client-authentication-method: POST + client-name: Kakao + scope: + - profile_nickname + - account_email + naver: + client-id: ${application.spring.security.naver.client-id} + client-secret: ${application.spring.security.naver.client-secret} + redirect-uri: http://localhost:8080/login/oauth2/code/naver + authorization-grant-type: authorization_code + scope: + - name + - email + provider: + kakao: + authorization-uri: https://kauth.kakao.com/oauth/authorize + token-uri: https://kauth.kakao.com/oauth/token + user-info-uri: https://kapi.kakao.com/v2/user/me + user-name-attribute: id + naver: + authorization-uri: https://nid.naver.com/oauth2.0/authorize + token-uri: https://nid.naver.com/oauth2.0/token + user-info-uri: https://openapi.naver.com/v1/nid/me + user-name-attribute: response + +jwt: + secret: ${application.jwt.secret} + secret_refresh: ${application.jwt.secret_refresh} \ No newline at end of file diff --git a/src/main/resources/email.properties b/src/main/resources/email.properties new file mode 100644 index 00000000..032238ef --- /dev/null +++ b/src/main/resources/email.properties @@ -0,0 +1,11 @@ +mail.smtp.auth=true +mail.smtp.starttls.required=true +mail.smtp.starttls.enable=true +mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory +mail.smtp.socketFactory.fallback=false +mail.smtp.port=465 +mail.smtp.socketFactory.port=465 + +# admin info +AdminMail.id=${email.AdminMail.id} +AdminMail.password=${email.AdminMail.password} \ No newline at end of file