728x90
이번엔 회원가입, 이메일 재설정,비밀번호 재설정 등 많은 서비스 구현에서 사용되는 emailAuth 를 구현해보자 !
1. '이메일 인증' 버튼을 누르면 Controller 에서 작동될 'postEmail' 메서드 만들기
@RequestMapping(value = "email",
method = RequestMethod.POST,
produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public String postEmail(UserEntity user, EmailAuthEntity emailAuth)
throws NoSuchAlgorithmException, MessagingException {
Enum<?> result = this.memberService.sendEmailAuth(user, emailAuth);
JSONObject responseObject = new JSONObject();
responseObject.put("result", result.name().toLowerCase());
if (result == CommonResult.SUCCESS) {
responseObject.put("salt", emailAuth.getSalt());
}
return responseObject.toString();
}
2. <1>에서 사용되는 sendEmailAuth Service 메서드 작성하기
2-1. 입력받은 email을 통해 이미 DB에 있는 user인지 검사
2-2. 중복된 이메일이 아닐경우, 인증 코드와 인증 Salt 생성
>> salt 를 생성하는 이유?
해시하려는 원본값에 추가하는 값으로 ,
2-3. 생성일시, 유효시간 생성
2-4. 필요한 정보 authEmail에 저장 후 insert
2-5. 타임리프를 이용해 보낼 메일의 정보를 저장한다.
@Transactional
public Enum<? extends IResult> sendEmailAuth(UserEntity user, EmailAuthEntity emailAuth) throws NoSuchAlgorithmException, MessagingException {
//1 0
//2 0
//3 X
UserEntity existingUser = this.memberMapper.selectUserByEmail((user.getEmail()));
if (existingUser != null) {
return SendEmailAuthResult.EMAIL_DUPLICATED;
}
String authCode = RandomStringUtils.randomNumeric(6);
String authSalt = String.format("%s%s%f%f",
user.getEmail(),
authCode,
Math.random(),
Math.random());
StringBuilder aythSaltHashBuilder = new StringBuilder();
MessageDigest md = MessageDigest.getInstance("SHA-512");
md.update(authSalt.getBytes(StandardCharsets.UTF_8));
for (byte hashByte : md.digest()) {
aythSaltHashBuilder.append(String.format("%02x", hashByte));
}
authSalt = aythSaltHashBuilder.toString();
Date createOn = new Date();
Date expiresOn = DateUtils.addMinutes(createOn, 5);
emailAuth.setEmail(user.getEmail());
emailAuth.setCode(authCode);
emailAuth.setSalt(authSalt);
emailAuth.setCreatedOn(createOn);
emailAuth.setExpiresOn(expiresOn);
emailAuth.setExpired(false);
if (this.memberMapper.insertEmailAuth(emailAuth) == 0) {
return CommonResult.FAILURE;
}
Context context = new Context(); // 타임리프
context.setVariable("code", emailAuth.getCode());
String text = this.templateEngine.process("member/registerEmailAuth", context);
MimeMessage mail = this.mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mail, "UTF-8");
helper.setFrom("보내는 사람 이메일");
helper.setTo(user.getEmail());//받는사람
helper.setSubject("메일제목");
helper.setText(text, true);
this.mailSender.send(mail);
return CommonResult.SUCCESS;
}
728x90
'Spring' 카테고리의 다른 글
[Spring] Spring 이란 ? (37) | 2023.10.29 |
---|---|
[오류] 유효한 문자는 RFC 7230 and RFC 3986에서 정의 오류 (0) | 2023.06.17 |
[SpringBoot] 회원가입 구현하기 (0) | 2023.02.14 |
[SprinBoot] @ResponseBody 어노테이션 (0) | 2022.12.27 |
[SpringBoot] 게시판 목록 < paging | pagination > 처리 및 검색기능 구현 코드 (5) | 2022.12.26 |