개발 순서는 다음과 같이 진행 하였습니다.
1. 비밀번호 찾기 페이지 이동을 개발합니다.
//비밀번호 찾기 public function pwsearch() { $this->load->view('auth/pwsearch_v'); }
2. 이메일 입력 후 서버에서 이메일 형식에 맞지 않거나 존재 하지 않은 이메일 경우에는 에러 메시지 개발
데이터베이스에서 검색을 해야 합니다..
function email_exists($email) { $this->load->database(); if($email) { $result=array(); $sql="select id from users where email = ?"; $query=$this->db->query($sql, array('email'=>$email)); $result=@$query->row(); if(!$result) { $this->form_validation->set_message('email_exists', $email.' 은 존재하지 않는 이메일입니다.'); return FALSE; }else { return TRUE; } }else{ return FALSE; } }
3. 랜덤 비밀번호 생성 여기서는 랜덤 문자열을 생성 하였습니다.
_GenerateString() 함수는 원하는 사이즈 만큼 생성 가능하며 여기서는 12자리로 생성하였습니다.
//랜덤 문자열 생성 function _GenerateString($length) { $characters = "0123456789"; $characters .= "abcdefghijklmnopqrstuvwxyz"; $characters .= "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; $string_generated = ""; $nmr_loops = $length; while ($nmr_loops--) { $string_generated .= $characters[mt_rand(0, strlen($characters))]; } return $string_generated; }
4. 랜덤으로 생성된 비밀 번호 암호화
MIT 에 개발한 암호화를 사용하였습니다.
https://gist.github.com/aheinze/6293939
$hash_format = sprintf("$2y$%02d$", $cost); 같은 경우 $2y$%02d$ 값을 임의로
변경 해서 사용하면 됩니다.
function alter($pw, $email){ $update=array('password'=>$pw); $where=array('userid'=>$email); $result=@$this->db->update('users', $update, $where); return $result; }
5. 암호화 된 비밀번호를 데이터베이스 모델에서 업데이트를 합니다.
function alter($pw, $email){ $update=array('password'=>$pw); $where=array('userid'=>$email); $result=@$this->db->update('users', $update, $where); return $result; }
6. 변경된 비밀번호를 이메일로 발송합니다.
//변경된 비밀번호 이메일로 발송 if($result){ $this->load->library('email'); $this->email->from('macaronics@macaronics.net', 'Macaronics', 'macaronics@macaronics.net'); $this->email->to($email); $this->email->subject('비밀번호 변경'); $html="<h3>변경된 비밀번호 : " .$random . "<h3> <h3><a href='http://macaronics.net/index.php/auth' target='_blank' >로그인 하기</a></h3>"; $this->email->message($html); if(!$this->email->send()){ alert("이메일 발송에 실패 하였습니다.", "/"); exit; }else{ alert("이메일로 전송 했습니다.", "/"); } }
전체 소스
컨트롤러 : Auth
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class Auth extends CI_Controller { function __construct() { parent::__construct(); $this->load->model('auth_m'); $this->load->helper(array('alert', 'form','url', 'date')); $this->load->library(array('script', 'common', 'session','form_validation')); $this->load->model('admin_menu01_m'); } /* * 주소에서 메서도가 생략되었을 때 실행되는 기본 메서드 * */ public function index() { $this->login(); } /* * 사이트 헤더, 푸터가 자동으로 추가된다. * */ public function _remap($method) { if(method_exists($this, $method)) { $this->{ "{$method}" }(); } } //비밀번호 찾기 public function pwsearch() { $this->load->view('auth/pwsearch_v'); } public function pwsearchsubmit() { $this->form_validation->set_rules("email", '이메일', 'required|valid_email|callback_email_exists'); if($this->form_validation->run()==FALSE){ //폼 검증이 실패했을 경우 또는 일력 페이지 $this->load->view('/auth/pwsearch_v'); }else{ //폼 검증 성공 했을 경우 //랜덤 비말번호 12자리 생성 $random=$this->_GenerateString(12); //비밀 번호 암호화 if(!function_exists('password_hash')){ $this->load->helper('password'); } $hash=password_hash($random, PASSWORD_BCRYPT); $email=$this->input->post('email', true); //암호화된 비밀 번호 데이터베이스 업데이트 $this->load->model('tank_auth/pw_alter_m'); $result=$this->pw_alter_m->alter($hash, $email); //변경된 비밀번호 이메일로 발송 if($result){ $this->load->library('email'); $this->email->from('macaronics@macaronics.net', 'Macaronics', 'macaronics@macaronics.net'); $this->email->to($email); $this->email->subject('비밀번호 변경'); $html="<h3>변경된 비밀번호 : " .$random . "<h3> <h3><a href='http://macaronics.net/index.php/auth' target='_blank' >로그인 하기</a></h3>"; $this->email->message($html); if(!$this->email->send()){ alert("이메일 발송에 실패 하였습니다.", "/"); exit; }else{ alert("이메일로 전송 했습니다.", "/"); } } } } //랜덤 문자열 생성 function _GenerateString($length) { $characters = "0123456789"; $characters .= "abcdefghijklmnopqrstuvwxyz"; $characters .= "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; $string_generated = ""; $nmr_loops = $length; while ($nmr_loops--) { $string_generated .= $characters[mt_rand(0, strlen($characters))]; } return $string_generated; } function email_exists($email) { $this->load->database(); if($email) { $result=array(); $sql="select id from users where email = ?"; $query=$this->db->query($sql, array('email'=>$email)); $result=@$query->row(); if(!$result) { $this->form_validation->set_message('email_exists', $email.' 은 존재하지 않는 이메일입니다.'); return FALSE; }else { return TRUE; } }else{ return FALSE; } }
모델 : Pw_alter_m.php
<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); class Pw_alter_m extends CI_Model{ function __construct() { parent:: __construct(); } function alter($pw, $email){ $update=array('password'=>$pw); $where=array('userid'=>$email); $result=@$this->db->update('users', $update, $where); return $result; } }
뷰 :
pwsearch_v.php
<?php defined('BASEPATH') OR exit('No direct script access allowed'); ?> <?php defined('BASEPATH') OR exit('No direct script access allowed'); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --> <title>Macaronics</title> <!-- Bootstrap --> <link href="/include/css/bootstrap.min.css" rel="stylesheet"> <!-- font awesome --> <link href="/include/css/font-awesome.min.css" rel="stylesheet"> <!-- Custom Style --> <link href="/include/css/style.css" rel="stylesheet"> <!-- Bootstrap Social Button --> <link href="/assets/lib/bootstrap_social/bootstrap-social.css" rel="stylesheet" > <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries --> <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></scri.row>.containerpt> <![endif]--> <!-- jQuery (necessary for Bootstrap's JavaScript plugins) --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> <!-- Include all compiled plugins (below), or include individual files as needed --> <script src="/include/js/bootstrap.min.js"></script> <script type="text/javascript" src="https://static.nid.naver.com/js/naverLogin_implicit-1.0.3.js" charset="utf-8"></script> </head> <body> <div class="container"> <div class="row"> <div class="col-md-4"> </div> <div class="col-md-4"> <div class="page-header"> <h2><a href="/">Macaronics</a></h2> </div> <div class="login-box well"> <?php $attribute=array( 'accept-charset'=>"UTF-8", 'role'=>"form", 'id'=>'auth_login', 'method' =>'post' ); echo form_open('/index.php/auth/pwsearchsubmit',$attribute); ?> <legend>비밀번호 찾기</legend> <div class="form-group"> <label for="email">이메일(아이디)</label> <input name="email" value='<?php echo set_value("email"); ?>' id="email" placeholder="이메일" type="email" class="form-control" /> </div> <div class="form-group"> <label for="username-email" style="color:red;"><?php if(form_error('email')){echo form_error('email');} else{ echo '';} ?></label> </div> <div class="form-group"> <input type="submit" class="btn btn-default btn-login-submit btn-block m-t-md" value="전송" /> </div> </form> </div> <div class="col-md-4"> </div> </div> </div> </div> </body> </html>
댓글 ( 4)
댓글 남기기