앱 만들고, 해당 비밀번호 저장해두기
만일, 앱 비밀번호 안 뜨면 2단계 인증을 진행해야 함
메일로 들어가서 IMAP 설정 변경 (해당 구글 계정으로 이메일 발송 예정)
유저 객체 생성
폼 설정
함수 (지금은 submit만 적어놨는데, 인풋 입력값 set으로 넣어주는 함수도 필요함)
@Service
@RequiredArgsConstructor
public class MailSendService {
// 이메일에 난수를 포함한 링크를 보내주는 서비스
private final JavaMailSender mailSender;
private final CertificationGenerator generator;
private final UserRepository userRepository;
private final PasswordEncoder passwordEncoder; // 스프링 시큐리티
public void sendEmailForCertification(String email)
throws NoSuchAlgorithmException, MessagingException {
// 비밀번호 생성
String certificationNumber = generator.createCertificationNumber();
String img = "<img src='이미지주소'/>";
String link = "<a href='http://localhost:3000/login'>로그인 링크</a>";
String content = String.format("%s <br> 임시비밀번호: %s <br><br> %s <br> 로그인 후 마이페이지에서 비밀번호를 수정해주세요.",
img,
certificationNumber,
link);
// 비밀번호 해싱
String userPw = passwordEncoder.encode(certificationNumber);
// DB에 비밀번호 저장
Optional<UserEntity> optionalUser = userRepository.findByUserEmail(email);
if (optionalUser.isPresent()) {
UserEntity user = optionalUser.get();
user.setUserPw(userPw); // 비밀번호 설정
userRepository.save(user); // 변경된 비밀번호를 DB 저장
}
// 이메일 전송
sendMail(email, content);
}
private void sendMail(String email, String content) throws MessagingException {
// 이메일 객체 생성
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage);
// 수신자, 제목, 내용 설정
helper.setTo(email);
helper.setSubject("AriQ 비밀번호 변경 메일");
helper.setText(content, true); // html변환 전달
// 메일 전송
mailSender.send(mimeMessage);
}
}
@Component
public class CertificationGenerator {
// 영문 알파벳
private static final String ALPHABET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
public String createCertificationNumber() throws NoSuchAlgorithmException {
StringBuilder result = new StringBuilder();
// 영어 알파벳과 숫자를 조합하여 난수 생성
do {
// 10자리의 난수 생성
for (int i = 0; i < 10; i++) {
// SecureRandom을 이용하여 0부터 35 사이의 난수 생성
int randomIndex = SecureRandom.getInstanceStrong().nextInt(ALPHABET.length() + 10);
// 숫자인 경우
if (randomIndex < 10) {
result.append(randomIndex);
}
// 알파벳인 경우
else {
// ALPHABET 문자열에서 랜덤한 영문 알파벳 선택하여 결과 추가
result.append(ALPHABET.charAt(randomIndex - 10));
}
}
} while (result.length() != 10);
return result.toString();
}
}