Christmas Pikachu 아이디, 비밀번호 찾기 기능
개발일지/스프링

아이디, 비밀번호 찾기 기능

ZI_CO 2023. 1. 8.

build.gradle

 // 이메일 인증 라이브러리
    implementation group: 'javax.mail', name: 'mail', version: '1.4.7'

 

 

 

 

1. 가입했을시 작성한 이메일(PK)로 아이디(username) 찾기

 

UserRespository

네이티브 쿼리 사용

@Query(value = " select * from User where email = ?1 ", nativeQuery = true)
	Optional<User> findByEmail(String email);

 

 

 

 

UserService

	@Transactional
	public User searchUserEmail(String email) {
		return userRepository.findByEmail(email).orElseThrow(() -> {
			return new IllegalArgumentException();
		});
	}

 

 

 

 

UserApiController

	// 아이디 찾기
	@PostMapping("/search")
	public ResponseDto<?> selectEamil(@RequestBody User user) {
		User userEntity = userService.searchUserEmail(user.getEmail());
		return new ResponseDto<>(true, userEntity.getUsername());
	}

 

 

 

 

 

 

 

 

2. 아이디와 이메일을 이용하여 가입시 작성한 이메일주소로 임시 비밀번호 발송하기

 

UserRespository

	@Query(value = " select * from user where username = ?1 and email = ?2 ", nativeQuery = true)
	Optional<User> findByPassword(String username, String email);

 

 

 

 

 

UserService

// 임시비밀번호 생성
	public String getTempPassword() {
		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 str = "";

		// 문자 배열 길이의 값을 랜덤으로 10개를 뽑아 구문을 작성함
		int idx = 0;
		for (int i = 0; i < 10; i++) {
			idx = (int) (charSet.length * Math.random());
			str += charSet[idx];
		}
		return str;
	}

 

 

 

// 임시비밀번호로 DB저장
	@Transactional
	public String searchPasswordChange(String email) {
		User userEntity = userRepository.findByEmail(email).orElseThrow(() -> {
			return new IllegalArgumentException("찾을 수 없는 회원입니다.");
		});
		String rawPassword = "";
		if (userEntity.getLoginType() == null || userEntity.getLoginType().equals("")) {

			rawPassword = getTempPassword();
			String encPassword = encoder.encode(rawPassword);

			userEntity.setPassword(encPassword);

		}
		return rawPassword;
	}

 

 

 

 

 

// 비밀번호 찾기
	@PostMapping("/send-mail")
	public ResponseDto<?> mailSend(@RequestBody User user) {
		
		User userEntity = userService.searchPassword(user.getUsername(), user.getEmail());
		LoginType lognType;
		try {
			lognType = userEntity.getLoginType();
		} catch (Exception e) {
			lognType = LoginType.CLICKGO;
		}
		
		if(lognType != LoginType.CLICKGO) {
			return new ResponseDto<String>(false, new String("소셜회원은 아이디/비밀번호를 찾을 수 없습니다. 관리자에게 문의해주세요"));
		}
		return new ResponseDto<>(true, naverMailSend(userEntity.getEmail()));
	}

	public int naverMailSend(String email) {
		String host = "smtp.naver.com";
		// 테스트후 개인정보 보안상 비밀번호는 지워주세요

		// SMTP 서버 정보를 설정한다.
		Properties props = new Properties(); // Properties는 java.util의 Properties입니다.
		props.put("mail.smtp.host", host); // smtp의 호스트
		props.put("mail.smtp.port", 587); // 587 포트 사용
		props.put("mail.smtp.auth", "true");
		props.put("mail.smtp.ssl.protocols", "TLSv1.2"); // 이 설정을 안붙이면 TLS Exception이 뜨더라구요. (버전이 안맞아서)

		Session session = Session.getDefaultInstance(props, new Authenticator() {
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(id, password);
			}
		});

		try {
			MimeMessage message = new MimeMessage(session);
			message.setFrom(new InternetAddress(id)); // 발신자의 이메일
			// 수신자 이메일
			message.addRecipient(Message.RecipientType.TO, new InternetAddress(email));

			// 메일 제목
			message.setSubject("Click-Go");

			// 메일 내용
			String temporary = userService.searchPasswordChange(email);
			message.setText("안녕하세요.\n 저희 클릭고 입니다. \n 임시비밀번호 : " + temporary); // 랜덤인 임시비밀번호를 생성

			// send the message
			Transport.send(message);
			return 0;
		} catch (MessagingException e) {
			e.printStackTrace();
			return -1;
		}
	}

 

 

 

 

application.yml

mail:
  id: 발신자 이메일(네이버 아이디) 주소
  pw: 발시자 비밀번호(네이버 비밀번호)

 

댓글