일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Servlet
- 페이징 정렬
- 값 타입
- JPQL
- Json 객체
- 자바
- 비밀번호 재설정 API
- springboot
- 스프링 이메일 전송
- 스프링부트 OpenAI API
- JDBC
- git 충돌 해결
- api 개발
- Git
- 프로그래머스
- 저장소 이전
- 파이썬
- MVC
- swap 메모리
- 두수의 합 자바
- 서버 배포
- github 복제
- jar빌드
- 저장소 복제
- MySQL
- Chat GPT
- JPA
- 우분투
- 넘파이
- HttpServletResponse
- Today
- Total
현의 개발 블로그
비밀번호 재설정 API 설계 본문
임시 비밀번호를 생성하고 요청 유저 이메일로 전송하는 API를 설계해보자.
설정
1. Gmail SMPT Server설정
구글 계정만 있으면 무료로 이메일 발송이 가능하다.
스프링에서 Gmail SMPT서버를 사용하기 위해 앱 비밀번호가 필요하다.
해당 비밀번호는 구글 보안(https://myaccount.google.com/security)에서 생성 가능하다.
앱 비밀 번호를 생성하려면 먼저 2단계 인증을 사용해야 한다.
그 후 앱 비밀번호를 생성한다.
생성된 비밀번호는 최초 한 번만 열람이 가능하니 미리 복사해두자.
2. 의존성 추가
build.gradle에 아래 코드를 추가한다.
implementation 'org.springframework.boot:spring-boot-starter-mail'
3. application.yml 설정
계정 정보이므로 프로젝트를 github에 올릴 경우 gitignore에 추가하자.
spring:
mail:
host: smtp.gmail.com
port: 465
username: {구글 이메일}
password: {구글 앱 비밀번호}
properties:
mail.smtp.auth: true
mail.smtp.ssl.enable: true
API 설계
서비스 로직
requestDto에는 유저 이메일과 유저 아이디가 담겨 있다.
유저 아이디로 유저를 조회하고 없으면 특정 응답을 반환한다.
유저 이메일이 DB와 일치하는지 확인하여 아닐 경우 특정 응답을 반환한다.
임시 비밀번호를 만들고 암호화하여 DB에 업데이트한다.
그 후 임시 비밀번호를 유저 이메일로 전송한다.
public BaseResponse<String> mailTempPassword(UserReq.MailTmpPw request){
User user = userRepository.findById(request.getUserId()).orElse(null);
if (user==null){
return new BaseResponse<>(NOT_EXIST_USER_ID);
}
if (!request.getEmail().equals(user.getEmail())) {
return new BaseResponse<>(INCORRECT_EMAIL);
}
String tmpPassword = getTmpPassword();
user.changeUserPw(passwordEncoder.encode(tmpPassword));
sendTmpPwd(user.getEmail(), tmpPassword);
return new BaseResponse<>(SUCCESS);
}
아래는 서비스 로직에 작성했던 함수이다.
임시 비밀번호 설정
문자 배열에서 랜덤으로 10개를 뽑아 비밀번호를 생성한 후 반환한다.
public String getTmpPassword() {
char[] charSet = new char[]{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
String pwd = "";
/* 문자 배열 길이의 값을 랜덤으로 10개를 뽑아 조합 */
int idx = 0;
for(int i = 0; i < 10; i++){
idx = (int) (charSet.length * Math.random());
pwd += charSet[idx];
}
return pwd;
}
이메일로 전송
application.yml에서 구글 계정 이메일 정보를 가져온다.
@Value를 import할 때 lombok을 import 하지 않도록 주의하자.
import org.springframework.beans.factory.annotation.Value;
@Value("${spring.mail.username}")
private String from;
유저에게 임시 비밀번호를 메일로 보낸다.
private void sendTmpPwd(String email, String tmpPassword) {
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(email);
message.setFrom(from);
message.setSubject("[북다락] 임시 비밀번호가 발급되었습니다.");
message.setText("임시 비밀번호는 "+ tmpPassword + "입니다.");
javaMailSender.send(message);
}
결과 확인
유저 이메일과 아이디를 넣어 비밀번호 변경 API를 호출한다.
해당 이메일로 임시 비밀번호가 전송된다.
임시 비밀번호를 입력해 비밀번호 변경이 가능하다.
Reference
[SpringBoot] 이메일 전송 ( JavaMailSender, MimeMessageHelper )
이번 글에서는 MailSender 인터페이스를 상속받은 JavaMailSender를 사용하여 이메일 전송 시스템을 구현해보도록 하겠습니다.전체 코드는 깃헙을 참고하시길 바랍니다. 개발환경IntelliJ 2019.02Java 11Sprin
victorydntmd.tistory.com
'대외활동 > 한이음' 카테고리의 다른 글
JPA 페이징 구현하기(2) (0) | 2023.07.20 |
---|---|
JPA 페이징 구현하기(1) (0) | 2023.07.20 |
우분투에서 서버 배포(3) - 빌드 및 실행 (0) | 2023.07.16 |
우분투에서 서버 배포(2) - swap 메모리 할당 (0) | 2023.07.16 |
우분투에서 서버 배포(1) - 프로그램 설치, git clone (0) | 2023.07.16 |