Skip to content

Commit

Permalink
feat: 이메일 인증 및 이메일 코드 확인 API 추가(38번, 39번 API 추가)
Browse files Browse the repository at this point in the history
네이버 SMTP를 이용하여 사용자에게 인증 이메일을 보내고 이메일에 담긴 인증코드를 확인하는 API 추가
  • Loading branch information
LeeSoMyoung committed Jul 7, 2022
1 parent 19a089b commit 3605921
Show file tree
Hide file tree
Showing 19 changed files with 261 additions and 5 deletions.
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,7 @@ application-s3.properties

# AWS Config 파일
AWSConfig.java
aws.yml
aws.yml

# 이메일 config
MailConfig.java
Binary file modified .gradle/6.7.1/executionHistory/executionHistory.bin
Binary file not shown.
Binary file modified .gradle/6.7.1/executionHistory/executionHistory.lock
Binary file not shown.
Binary file modified .gradle/6.7.1/fileHashes/fileHashes.bin
Binary file not shown.
Binary file modified .gradle/6.7.1/fileHashes/fileHashes.lock
Binary file not shown.
Binary file modified .gradle/6.7.1/fileHashes/resourceHashesCache.bin
Binary file not shown.
Binary file modified .gradle/6.7.1/javaCompile/classAnalysis.bin
Binary file not shown.
Binary file modified .gradle/6.7.1/javaCompile/jarAnalysis.bin
Binary file not shown.
Binary file modified .gradle/6.7.1/javaCompile/javaCompile.lock
Binary file not shown.
Binary file modified .gradle/6.7.1/javaCompile/taskHistory.bin
Binary file not shown.
Binary file modified .gradle/buildOutputCleanup/buildOutputCleanup.lock
Binary file not shown.
1 change: 0 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ dependencies {
// 이메일 인증
implementation 'org.springframework.boot:spring-boot-starter-mail'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'

}

test {
Expand Down
14 changes: 12 additions & 2 deletions build/tmp/compileJava/source-classes-mapping.txt
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ com/example/demo/src/main/model/GetEventsRes.java
com.example.demo.src.main.model.GetEventsRes
com/example/demo/src/user/model/PostUserRes.java
com.example.demo.src.user.model.PostUserRes
com/example/demo/src/mail/model/PostVerifyCodeReq.java
com.example.demo.src.mail.model.PostVerifyCodeReq
com/example/demo/src/category/model/GetCategoryDetailRes.java
com.example.demo.src.category.model.GetCategoryDetailRes
com/example/demo/src/main/model/GetEventDetailRes.java
Expand Down Expand Up @@ -70,6 +72,8 @@ com/example/demo/src/store/model/GetTodaysDealMainRes.java
com.example.demo.src.store.model.GetTodaysDealMainRes
com/example/demo/src/store/model/PostScrapReq.java
com.example.demo.src.store.model.PostScrapReq
com/example/demo/src/mail/service/MailService.java
com.example.demo.src.mail.service.MailService
com/example/demo/src/user/model/GetHouseCategoryRes.java
com.example.demo.src.user.model.GetHouseCategoryRes
com/example/demo/src/store/model/GetInquiryRes.java
Expand Down Expand Up @@ -122,6 +126,8 @@ com/example/demo/src/category/CategoryProvider.java
com.example.demo.src.category.CategoryProvider
com/example/demo/src/user/model/GetScrapFoldersRes.java
com.example.demo.src.user.model.GetScrapFoldersRes
com/example/demo/src/mail/dao/MailDao.java
com.example.demo.src.mail.dao.MailDao
com/example/demo/config/secret/Secret.java
com.example.demo.config.secret.Secret
com/example/demo/src/user/model/PostScrapBookRes.java
Expand All @@ -148,12 +154,12 @@ com/example/demo/config/BaseException.java
com.example.demo.config.BaseException
com/example/demo/src/main/model/GetReviewWriteRes.java
com.example.demo.src.main.model.GetReviewWriteRes
com/example/demo/src/review/model/GetMyReviewsRes.java
com.example.demo.src.review.model.GetMyReviewsRes
com/example/demo/src/user/model/GetScrapHousePicRes.java
com.example.demo.src.user.model.GetScrapHousePicRes
com/example/demo/src/user/model/PostScrapBookReq.java
com.example.demo.src.user.model.PostScrapBookReq
com/example/demo/src/review/model/GetMyReviewsRes.java
com.example.demo.src.review.model.GetMyReviewsRes
com/example/demo/src/user/model/PostUserReq.java
com.example.demo.src.user.model.PostUserReq
com/example/demo/src/category/dao/CategoryDao.java
Expand All @@ -166,6 +172,8 @@ com/example/demo/src/category/controller/CategoryController.java
com.example.demo.src.category.controller.CategoryController
com/example/demo/src/main/model/GetGuestOrderRes.java
com.example.demo.src.main.model.GetGuestOrderRes
com/example/demo/src/mail/controller/MailController.java
com.example.demo.src.mail.controller.MailController
com/example/demo/src/main/controller/MainController.java
com.example.demo.src.main.controller.MainController
com/example/demo/src/WebSecurityConfig.java
Expand All @@ -174,6 +182,8 @@ com/example/demo/src/category/model/GetAllCategoryRes.java
com.example.demo.src.category.model.GetAllCategoryRes
com/example/demo/src/store/model/PostScrapRes.java
com.example.demo.src.store.model.PostScrapRes
com/example/demo/config/mail/MailConfig.java
com.example.demo.config.mail.MailConfig
com/example/demo/src/store/model/PostInquiryReq.java
com.example.demo.src.store.model.PostInquiryReq
com/example/demo/src/user/model/GetOrderReq.java
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,9 @@ public enum BaseResponseStatus {
EMPTY_INQUIRY_CATEGORY(false, 2055, "문의 카테고리를 입력해주세요."),
EMPTY_INQUIRY_DESCRIPTION(false, 2056, "문의 내용을 입력해주세요."),
INVALID_INQUIRY_ISPUBLIC(false, 2057, "공개 여부 코드가 잘못되었습니다. 0과 1 중에 다시 선택해주세요."),

EMPTY_VERIFICATION_CODE(false, 2058, "인증 코드를 입력하세요."),
EMPTY_VERIFICATION_CODE_ID(false, 2059, "인증 코드 id를 입력해주세요."),
INVALID_VERIFICATION_CODE(false, 2060, "올바르지 않은 이메일 인증 코드이거나 만료된 인증 코드입니다."),
/**
* 3000 : Response 오류
*/
Expand Down
37 changes: 37 additions & 0 deletions src/main/java/com/example/demo/config/mail/MailConfig.java
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;
}
}
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());
}
}
}
41 changes: 41 additions & 0 deletions src/main/java/com/example/demo/src/mail/dao/MailDao.java
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);
}

}
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 src/main/java/com/example/demo/src/mail/service/MailService.java
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();
}
}

}

0 comments on commit 3605921

Please sign in to comment.