-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: 이메일 인증 및 이메일 코드 확인 API 추가(38번, 39번 API 추가)
네이버 SMTP를 이용하여 사용자에게 인증 이메일을 보내고 이메일에 담긴 인증코드를 확인하는 API 추가
- Loading branch information
1 parent
19a089b
commit 3605921
Showing
19 changed files
with
261 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -32,4 +32,7 @@ application-s3.properties | |
|
||
# AWS Config 파일 | ||
AWSConfig.java | ||
aws.yml | ||
aws.yml | ||
|
||
# 이메일 config | ||
MailConfig.java |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
37 changes: 37 additions & 0 deletions
37
src/main/java/com/example/demo/config/mail/MailConfig.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
package com.example.demo.config.mail; | ||
|
||
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 MailConfig { | ||
@Bean | ||
public JavaMailSender javaMailService() { | ||
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl(); | ||
|
||
javaMailSender.setHost("smtp.naver.com"); | ||
javaMailSender.setUsername("hongbeluga"); | ||
javaMailSender.setPassword("leebfjds87x"); | ||
|
||
javaMailSender.setPort(465); | ||
|
||
javaMailSender.setJavaMailProperties(getMailProperties()); | ||
|
||
return javaMailSender; | ||
} | ||
|
||
private Properties getMailProperties() { | ||
Properties properties = new Properties(); | ||
properties.setProperty("mail.transport.protocol", "smtp"); | ||
properties.setProperty("mail.smtp.auth", "true"); | ||
properties.setProperty("mail.smtp.starttls.enable", "true"); | ||
properties.setProperty("mail.debug", "true"); | ||
properties.setProperty("mail.smtp.ssl.trust","smtp.naver.com"); | ||
properties.setProperty("mail.smtp.ssl.enable","true"); | ||
return properties; | ||
} | ||
} |
76 changes: 76 additions & 0 deletions
76
src/main/java/com/example/demo/src/mail/controller/MailController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
package com.example.demo.src.mail.controller; | ||
|
||
import com.example.demo.config.BaseException; | ||
import com.example.demo.config.BaseResponse; | ||
import com.example.demo.config.BaseResponseStatus; | ||
import com.example.demo.src.mail.model.PostVerifyCodeReq; | ||
import com.example.demo.src.mail.service.MailService; | ||
import com.example.demo.utils.ValidationRegex; | ||
import jdk.nashorn.internal.parser.JSONParser; | ||
import lombok.AllArgsConstructor; | ||
import org.json.JSONObject; | ||
import org.springframework.beans.factory.annotation.Autowired; | ||
import org.springframework.web.bind.annotation.*; | ||
|
||
@RestController | ||
@RequestMapping("/users/mails") | ||
@AllArgsConstructor | ||
public class MailController { | ||
@Autowired | ||
private final MailService mailService; | ||
|
||
|
||
@ResponseBody | ||
@PostMapping("") | ||
public BaseResponse<Long> sendEmail(@RequestBody String data) throws BaseException{ | ||
JSONObject parser = new JSONObject(data); | ||
String email = parser.getString("email"); | ||
|
||
if(email == null){ | ||
return new BaseResponse<>(BaseResponseStatus.POST_USERS_EMPTY_EMAIL); | ||
} | ||
|
||
if(!ValidationRegex.isRegexEmail(email)){ | ||
return new BaseResponse<>(BaseResponseStatus.POST_USERS_INVALID_EMAIL); | ||
} | ||
|
||
try{ | ||
|
||
mailService.sendCertificationMail(email); | ||
|
||
long verifyCodeId = mailService.sendCertificationMail(email); | ||
|
||
return new BaseResponse<Long>(verifyCodeId); | ||
} | ||
catch (BaseException baseException){ | ||
return new BaseResponse<>(baseException.getStatus()); | ||
} | ||
} | ||
|
||
@ResponseBody | ||
@PostMapping("/verifications") | ||
public BaseResponse<String> verifyEmailCode(@RequestBody PostVerifyCodeReq postVerifyCodeReq) throws BaseException{ | ||
if(postVerifyCodeReq.getCode() == null){ | ||
return new BaseResponse<>(BaseResponseStatus.EMPTY_VERIFICATION_CODE); | ||
} | ||
|
||
if(postVerifyCodeReq.getEmail() == null){ | ||
return new BaseResponse<>(BaseResponseStatus.POST_USERS_EMPTY_EMAIL); | ||
} | ||
|
||
try{ | ||
int result = mailService.checkCode(postVerifyCodeReq); | ||
|
||
if(result == 0){ | ||
return new BaseResponse<>(BaseResponseStatus.INVALID_VERIFICATION_CODE); | ||
} | ||
|
||
String message = "이메일 인증에 성공하였습니다."; | ||
|
||
return new BaseResponse<String>(message); | ||
} | ||
catch (BaseException baseException){ | ||
return new BaseResponse<>(baseException.getStatus()); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
package com.example.demo.src.mail.dao; | ||
|
||
import com.example.demo.src.mail.model.PostVerifyCodeReq; | ||
import org.springframework.beans.factory.annotation.Autowired; | ||
import org.springframework.jdbc.core.JdbcTemplate; | ||
import org.springframework.stereotype.Repository; | ||
|
||
import javax.sql.DataSource; | ||
|
||
@Repository | ||
public class MailDao { | ||
private JdbcTemplate jdbcTemplate; | ||
|
||
@Autowired | ||
public void setDataSource(DataSource dataSource){this.jdbcTemplate = new JdbcTemplate(dataSource);} | ||
|
||
public long createVerificationCode(String code, String email){ | ||
String createVerificationCodeQuery = "INSERT INTO VerifyCodes(code, email) VALUES(?, ?);"; | ||
Object[] createVerificationCodeQueryParams = new Object[]{code, email}; | ||
|
||
this.jdbcTemplate.update(createVerificationCodeQuery, createVerificationCodeQueryParams); | ||
|
||
String retrieveLastInsertIdQuery = "SELECT LAST_INSERT_ID();"; | ||
|
||
return this.jdbcTemplate.queryForObject(retrieveLastInsertIdQuery, long.class); | ||
} | ||
|
||
public int checkCode(PostVerifyCodeReq postVerifyCodeReq){ | ||
String checkCodeQuery = "SELECT EXISTS(\n" + | ||
" SELECT codeId FROM VerifyCodes\n" + | ||
" WHERE email = ? AND TIMESTAMPDIFF(SECOND , createdAt, CURRENT_TIMESTAMP) < 180\n" + | ||
" AND code = ? AND codeId = ?\n" + | ||
" );"; | ||
Object[] checkCodeQueryParams = new Object[]{ | ||
postVerifyCodeReq.getEmail(), postVerifyCodeReq.getCode(), postVerifyCodeReq.getId() | ||
}; | ||
|
||
return this.jdbcTemplate.queryForObject(checkCodeQuery, int.class, checkCodeQueryParams); | ||
} | ||
|
||
} |
14 changes: 14 additions & 0 deletions
14
src/main/java/com/example/demo/src/mail/model/PostVerifyCodeReq.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
package com.example.demo.src.mail.model; | ||
|
||
import lombok.AllArgsConstructor; | ||
import lombok.Getter; | ||
import lombok.Setter; | ||
|
||
@Getter | ||
@Setter | ||
@AllArgsConstructor | ||
public class PostVerifyCodeReq { | ||
String email; | ||
String code; | ||
long id; // verification Id | ||
} |
74 changes: 74 additions & 0 deletions
74
src/main/java/com/example/demo/src/mail/service/MailService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,9 +1,83 @@ | ||
package com.example.demo.src.mail.service; | ||
|
||
import com.example.demo.config.BaseException; | ||
import com.example.demo.config.BaseResponseStatus; | ||
import com.example.demo.config.secret.Secret; | ||
import com.example.demo.src.mail.dao.MailDao; | ||
import com.example.demo.src.mail.model.PostVerifyCodeReq; | ||
import com.example.demo.src.user.UserProvider; | ||
import lombok.AllArgsConstructor; | ||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
import org.springframework.beans.factory.annotation.Autowired; | ||
import org.springframework.mail.MailException; | ||
import org.springframework.mail.javamail.JavaMailSender; | ||
import org.springframework.stereotype.Component; | ||
import org.springframework.stereotype.Service; | ||
import org.springframework.transaction.annotation.Transactional; | ||
|
||
import javax.mail.Message; | ||
import javax.mail.internet.InternetAddress; | ||
import javax.mail.internet.MimeMessage; | ||
import java.util.UUID; | ||
|
||
@Service | ||
@AllArgsConstructor | ||
public class MailService { | ||
|
||
@Autowired | ||
private final JavaMailSender javaMailSender; | ||
private final Logger logger = LoggerFactory.getLogger(this.getClass()); | ||
|
||
@Autowired | ||
private final UserProvider userProvider; | ||
|
||
@Autowired | ||
private final MailDao mailDao; | ||
|
||
public long sendCertificationMail(String email) throws BaseException { | ||
if(userProvider.checkEmail(email) == 1){ | ||
throw new BaseException(BaseResponseStatus.DUPLICATED_EMAIL); | ||
} | ||
try{ | ||
String code = UUID.randomUUID().toString().substring(0, 6); | ||
sendMail(code, email); | ||
|
||
return mailDao.createVerificationCode(code, email); | ||
}catch (Exception exception){ | ||
exception.printStackTrace(); | ||
throw new BaseException(BaseResponseStatus.DATABASE_ERROR); | ||
} | ||
} | ||
|
||
public int checkCode(PostVerifyCodeReq postVerifyCodeReq) throws BaseException{ | ||
try{ | ||
return mailDao.checkCode(postVerifyCodeReq); | ||
}catch (Exception exception){ | ||
throw new BaseException(BaseResponseStatus.DATABASE_ERROR); | ||
} | ||
} | ||
|
||
private MimeMessage createMessage(String code, String email) throws Exception{ | ||
MimeMessage message = javaMailSender.createMimeMessage(); | ||
|
||
message.addRecipients(Message.RecipientType.TO, email); | ||
message.setSubject("오늘의 집 모의외주 프로젝트 인증 번호입니다."); | ||
message.setText("이메일 인증코드: "+code); | ||
|
||
message.setFrom(new InternetAddress(Secret.RECIPIENT)); | ||
|
||
return message; | ||
} | ||
|
||
public void sendMail(String code, String email) throws Exception{ | ||
try{ | ||
MimeMessage mimeMessage = createMessage(code, email); | ||
javaMailSender.send(mimeMessage); | ||
}catch (MailException mailException){ | ||
mailException.printStackTrace(); | ||
throw new IllegalAccessException(); | ||
} | ||
} | ||
|
||
} |