본문 바로가기

프로그래밍 /SPRING

[SPRING] 이메일 인증


Spring으로  이메일 인증하기


1. 구글 설정 (<--클릭으로 링크)

보안 수준이 낮은 앱 허용 사용 체크 


2. MAVEN 추가 (Pom.xml) 라이브러리 업데이트


        <!-- mail 인증을 위한 설정-->
        <!-- mail -->
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.7</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>



3. ROOT-CONTEXT.XML 설정


    
    <!-- 메일 보내기 (SEND) -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="smtp.gmail.com" />
<property name="port" value="587" />
<property name="username" value="사용자이메일" />
<property name="password" value="사용자비밀번호" />
    

<!-- email 요청시는 SMTP -->
<property name="javaMailProperties">
<props>
<prop key="mail.transport.protocol">smtp</prop>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
<prop key="mail.debug">true</prop>
</props>
</property>
</bean>



4.MailHandler.java 생성


/*
* 메일 인증 서비스 사용하기
}

*
*
*
*
* */
public class MailHandler {
     private JavaMailSender mailSender;
     private MimeMessage message;
     private MimeMessageHelper messageHelper;


     public MailHandler(JavaMailSender mailSender) throws MessagingException {
     this.mailSender = mailSender;
     message = this.mailSender.createMimeMessage();
     messageHelper = new MimeMessageHelper(message, true, "UTF-8");
     }


     public void setSubject(String subject) throws MessagingException {
     messageHelper.setSubject(subject);
    
     // 이메일 타이틀
     }
     public void setText(String htmlContent) throws MessagingException {
     messageHelper.setText(htmlContent, true);
    
     // 이메일 TEXT 부분
     }
     public void setFrom(String email, String name) throws UnsupportedEncodingException, MessagingException {
     messageHelper.setFrom(email, name);
     // 보내는 사람 이메일
     }
     public void setTo(String email) throws MessagingException {
     messageHelper.setTo(email);
     //받는 사람 이메일
     }
     public void addInline(String contentId, DataSource dataSource) throws MessagingException {
     messageHelper.addInline(contentId, dataSource);
     }
     public void send() {
     try {
     mailSender.send(message);
     }catch (Exception e) {
     e.printStackTrace();
     }
     }



5.TempKey.java 생성성

(이메일 인증 키 생성을 위해서 사용될)


/*
*
* 인증키를 생성
*
*
*
*
* */

public class TempKey {

private boolean lowerCheck;
private int size;

public String getKey(int size, boolean lowerCheck) {
this.size = size;
this.lowerCheck = lowerCheck;
return init();
}

private String init() {
Random ran = new Random();
StringBuffer sb = new StringBuffer();
int num = 0;
do {
num = ran.nextInt(75)+48;
if((num>=48 && num<=57) || (num>=65 && num<=90) || (num>=97 && num<=122)) {
sb.append((char)num);
}else {
continue;
}
} while (sb.length() < size);
if(lowerCheck) {
return sb.toString().toLowerCase();
}
return sb.toString();
}



6.Controller 작성 


    @RequestMapping(value = "/register", method = RequestMethod.POST)
    public String RegisterPost(MemberVO user,Model model,RedirectAttributes rttr) throws Exception{
        System.out.println("regesterPost 진입 ");
    service.regist(user);
rttr.addFlashAttribute("msg" , "가입시 사용한 이메일로 인증해주세요");
        return "redirect:/";
    }

    //이메일 인증 코드 검증
    @RequestMapping(value = "/emailConfirm", method = RequestMethod.GET)
    public String emailConfirm(MemberVO user,Model model,RedirectAttributes rttr) throws Exception {
        
        System.out.println("cont get user"+user);
        MemberVO vo = new MemberVO();
        vo=service.userAuth(user);
        if(vo == null) {
            rttr.addFlashAttribute("msg" , "비정상적인 접근 입니다. 다시 인증해 주세요");
            return "redirect:/";
        }
        //System.out.println("usercontroller vo =" +vo);
        model.addAttribute("login",vo);
        return "/user/emailConfirm";
    }

(회원가입 등록시 userState 인증코드 생성 )  회원인증을 통해서 로그인 가능 유무 활성화 제어)



7.UserDAO 생성


    //회원 정보 입력
    @Override
    public void insertUser(MemberVO vo) throws Exception {
        System.out.println("회원등록완료 !!!");
        session.insert(namespace+".insertUser",vo);
        System.out.println("//////////////////////////////////");
        System.out.println("회원등록완료 !!!");
    }
    //email 중복 확인
    @Override
    public MemberVO authenticate(String str) throws Exception {
        return session.selectOne(namespace+".checkdupl", str);
    }
 
    //해당 email에 인증 키 업데이트
    @Override
    public void createAuthKey(String memberEmail, String memberAuthKey) throws Exception {
        MemberVO vo = new MemberVO();
        vo.setMemberAuthKey(memberAuthKey);
        vo.setMemberEmail(memberEmail);
        session.update(namespace + ".createAuthKey", vo);
    }
    //이메일 인증 코드 확인
    @Override
    public MemberVO chkAuth(MemberVO vo) throws Exception {
        return session.selectOne(namespace + ".chkAuth", vo);
    }
    //인증 후 계정 활성화
    @Override
    public void userAuth(MemberVO vo) throws Exception {
        System.out.println("인증하나요??");
        
        session.update(namespace + ".userAuth", vo);
        System.out.println(vo.getUserState());
    }


8.Service 생성


    @Inject
    private JavaMailSender mailSender;


    @Override
    public void regist(MemberVO vo) throws Exception {
        
        System.out.println("서비스레지스");

        String encPassword = passwordEncoder.encode(vo.getMemberPassword());
        vo.setMemberPassword(encPassword);
        //System.out.println("암호화된 비밀번호 : "+user.getUserPassword());

        dao.insertUser(vo);
        System.out.println(vo);
        System.out.println("/////////////////////// 찍히");
        String key = new TempKey().getKey(50,false); // 인증키 생성

        dao.createAuthKey(vo.getMemberEmail(),key); //인증키 db 저장
        //메일 전송
        MailHandler sendMail = new MailHandler(mailSender);
        sendMail.setSubject("FAINT 서비스 이메일 인증]");
        sendMail.setText(
                new StringBuffer().append("<h1>메일인증</h1>").append("<a href='http://localhost:8080/user
/emailConfirm?userEmail=").
append(vo.getMemberEmail()).
append("&memberAuthKey=").append(key).
append("' target='_blank'>이메일 인증 확인</a>").toString());
        sendMail.setFrom("sososososo@gmail.com", "서어비스센터 ");


        sendMail.setTo(vo.getMemberEmail());
        sendMail.send();
    }

    //이메일 인증 키 검증
    @Override
    public MemberVO userAuth(MemberVO user) throws Exception {
MemberVO vo =new MemberVO();
        System.out.println(user+"user");
vo=dao.chkAuth(user);
if(vo!=null){
try{
    System.out.println(vo+"vo");
dao.userAuth(user);
                dao.successAuth(vo);
}catch (Exception e) {
e.printStackTrace();
}}
return vo;
    }



▼▼▼▼▼

회원가입 후 이메일을 확인하면 



완료 !!!!!!