Skip to content

Commit 443b444

Browse files
authored
Feature: Gmail 인증번호 전송 틀 마련, refreshToken Swagger 추가 (#76)
* feature : gmail 전송 기본 설정 및 service 클래스 생성 * feature : 메일 전송 기능 추가 * docs : refreshToken 발급 parameter추가 * coderabbit반영 * ci.yml 반영
1 parent ce79823 commit 443b444

File tree

7 files changed

+119
-5
lines changed

7 files changed

+119
-5
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ jobs:
3535
REDIRECT_URI: ${{ secrets.REDIRECT_URI }}
3636
SPRING_MONGODB_URI: ${{ secrets.SPRING_MONGODB_URI}}
3737
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
38+
EZ_EMAIL : ${{ secrets.EZ_EMAIL }}
39+
APP_PASSWORD : ${{ secrets.APP_PASSWORD }}
3840

3941
steps:
4042
- name: Checkout Repository

build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,10 @@ dependencies {
107107
implementation 'org.mapstruct:mapstruct:1.6.3'
108108
annotationProcessor 'org.mapstruct:mapstruct-processor:1.6.3'
109109

110+
//email-smtp
111+
implementation 'org.springframework.boot:spring-boot-starter-mail'
112+
113+
110114
}
111115

112116
tasks.named('test') {
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package org.ezcode.codetest.domain.user.service;
2+
3+
import org.springframework.beans.factory.annotation.Value;
4+
import org.springframework.mail.javamail.JavaMailSender;
5+
import org.springframework.stereotype.Service;
6+
7+
import jakarta.mail.MessagingException;
8+
import jakarta.mail.internet.MimeMessage;
9+
import lombok.RequiredArgsConstructor;
10+
11+
@Service
12+
@RequiredArgsConstructor
13+
public class MailService {
14+
private final JavaMailSender javaMailSender;
15+
@Value("${spring.mail.username}")
16+
private String senderEmail;
17+
private static int number;
18+
19+
// 랜덤으로 숫자 생성
20+
public static void createNumber() {
21+
number = (int)(Math.random() * (90000)) + 100000; //(int) Math.random() * (최댓값-최소값+1) + 최소값
22+
}
23+
public MimeMessage CreateMail(String mail) {
24+
createNumber();
25+
MimeMessage message = javaMailSender.createMimeMessage();
26+
27+
try {
28+
message.setFrom(senderEmail);
29+
message.setRecipients(MimeMessage.RecipientType.TO, mail);
30+
message.setSubject("이메일 인증");
31+
String body = "";
32+
body += "<h3>" + "요청하신 인증 번호입니다." + "</h3>";
33+
body += "<h1>" + number + "</h1>";
34+
body += "<h3>" + "감사합니다." + "</h3>";
35+
message.setText(body,"UTF-8", "html");
36+
} catch (MessagingException e) {
37+
e.printStackTrace();
38+
}
39+
40+
return message;
41+
}
42+
43+
public int sendMail(String mail) {
44+
MimeMessage message = CreateMail(mail);
45+
javaMailSender.send(message);
46+
47+
return number;
48+
}
49+
}

src/main/java/org/ezcode/codetest/domain/user/service/UserDomainService.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,6 @@ public String encodePassword(String password) {
7676
return passwordEncoder.encode(password);
7777
}
7878

79-
// public User getOAuthUser(String email, String provider) {
80-
// return userRepository.findByEmailAndProvider(email, provider);
81-
// }
82-
8379
//유저의 AuthType을 리스트형태로 반환
8480
public List<AuthType> getUserAuthTypes(User user) {
8581
return userAuthTypeRepository.getUserAuthType(user);

src/main/java/org/ezcode/codetest/presentation/usermanagement/AuthController.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.springframework.web.bind.annotation.RestController;
2222

2323
import io.swagger.v3.oas.annotations.Operation;
24+
import io.swagger.v3.oas.annotations.Parameter;
2425
import io.swagger.v3.oas.annotations.tags.Tag;
2526
import jakarta.servlet.http.HttpServletRequest;
2627
import jakarta.validation.Valid;
@@ -60,7 +61,10 @@ public ResponseEntity<LogoutResponse> logout(
6061
return ResponseEntity.status(HttpStatus.OK).body(authService.logout(authUser.getId(), token));
6162
}
6263

63-
@Operation(summary = "토큰 재발급", description = "리프레시 토큰을 이용하여 새로운 액세스 토큰을 발급합니다.")
64+
@Operation(summary = "토큰 재발급", description = "리프레시 토큰을 이용하여 새로운 액세스 토큰을 발급합니다.",
65+
parameters = {
66+
@Parameter(name = "Authorization", description = "Bearer {refreshToken}", required = true)
67+
})
6468
@PostMapping("/auth/refresh")
6569
public ResponseEntity<RefreshTokenResponse> refresh(HttpServletRequest request) {
6670

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package org.ezcode.codetest.presentation.usermanagement;
2+
3+
import java.util.HashMap;
4+
5+
import org.ezcode.codetest.domain.user.model.entity.AuthUser;
6+
import org.ezcode.codetest.domain.user.service.MailService;
7+
import org.springframework.http.ResponseEntity;
8+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
9+
import org.springframework.web.bind.annotation.GetMapping;
10+
import org.springframework.web.bind.annotation.PostMapping;
11+
import org.springframework.web.bind.annotation.RequestParam;
12+
import org.springframework.web.bind.annotation.RestController;
13+
14+
import lombok.RequiredArgsConstructor;
15+
16+
@RestController
17+
@RequiredArgsConstructor
18+
public class MailCheckController {
19+
private final MailService mailService;
20+
private int number; // 이메일 인증 숫자를 저장하는 변수
21+
22+
// 인증 이메일 전송
23+
@PostMapping("/mailSend")
24+
public HashMap<String, Object> mailSend(
25+
@AuthenticationPrincipal AuthUser authUser) {
26+
HashMap<String, Object> map = new HashMap<>();
27+
28+
try {
29+
number = mailService.sendMail(authUser.getEmail());
30+
31+
map.put("success", Boolean.TRUE);
32+
} catch (Exception e) {
33+
map.put("success", Boolean.FALSE);
34+
map.put("error", e.getMessage());
35+
}
36+
37+
return map;
38+
}
39+
40+
// 인증번호 일치여부 확인
41+
@GetMapping("/mailCheck")
42+
public ResponseEntity<?> mailCheck(@RequestParam String userNumber) {
43+
44+
boolean isMatch = userNumber.equals(String.valueOf(number));
45+
46+
return ResponseEntity.ok(isMatch);
47+
}
48+
}

src/main/resources/application.properties

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,17 @@ logging.level.org.springframework.cache.interceptor.CacheInterceptor=TRACE
101101
# ========================
102102
discord.webhook.url=${DISCORD_WEBHOOK_URL}
103103

104+
# ========================
105+
# email-smtp
106+
# ========================
107+
spring.mail.host=smtp.gmail.com
108+
spring.mail.port=587
109+
spring.mail.username=${EZ_EMAIL}
110+
spring.mail.password=${APP_PASSWORD}
111+
spring.mail.properties.mail.smtp.auth=true
112+
spring.mail.properties.mail.smtp.timeout=5000
113+
spring.mail.properties.mail.smtp.starttls.enable=true
114+
104115
#logging.level.org.springframework.security=DEBUG
105116
#logging.level.org.springframework.security.oauth2=DEBUG
106117
#logging.level.org.springframework.security.oauth2.client=TRACE

0 commit comments

Comments
 (0)