Codeigniter

2. 페이스북 로그인 연동 처리

 

컨트롤러 Auth

모든 sns 의 공통 등록 처리 코드 

sns 의경우 이메일이 없는 경우가 있으므로 없을 경우 sns_id 값으로 저장한다.
        $insertId=$assign_data['email']!=null ? $assign_data['email'] :$assign_data['sns_id'];

 

  // Register Action Process
    function _register_action($assign_data) {

         //sns 의경우 이메일이 없는 경우가 있으므로 없을 경우 sns_id 값으로 저장
        $insertId=$assign_data['email']!=null ? $assign_data['email'] :$assign_data['sns_id'];
        
        //sns_id 로 기존에 등록된 유저 확인
        $sql="select * from users where userid=?";
        $query=$this->db->query($sql,  $insertId);
        
       
        $message="";
        //등록된 userid 를 확인 한다.
        if($query->num_rows() > 0){
            //테스트 메시지
            $message="userid 가 존재";
        }
        else
        {
            //userid 값이 없으면 등록한다. 
             // Member Register in Your Code.       
             $data=array(
                'userid' =>$insertId,
                'sns_id'=>$assign_data['sns_id'],
                'sns_type'=>$assign_data['sns_type'],
                'register_auth_code'=>1,  //이메일 인증 코드 1로 
                'profile_img'=>$assign_data['profile_img'],
                'email'=>$assign_data['email'],
                'nickname'=>$assign_data['nickname'],
                'register_ip'=>$_SERVER['REMOTE_ADDR']
                );       
            $this->db->insert('users', $data);
              $message="등록했습니다.";
                      
        }
        
        //DB에서 정보를 다시 불러온다.
        $sql="select * from users where userid=?";
        $query=$this->db->query($sql,  $insertId);
        $result=$query->row();

         //세션 생성         
        if($result) {             
            //세션 생성         
            $newdata =array(
                'nickname' =>$result->nickname,
                'email' =>$result->email,
                'logged_in' =>TRUE,
                'auth_code' =>$result->auth_code,
                'icon'=>$result->icon,
                'sns_type'=>$result->sns_type,
                'userid' =>$result->userid
            );
            
            $this->session->set_userdata($newdata);
            
            redirect('/');
            exit;
         }else{
             
             alert('로그인에 실패 하였습니다.', '/');
             exit;
         }                            
    }

 

페이 스북인 경우 다음과 같이 /auth/registerFaceBookl  포스트로  로 받아 온다.

public function registerFaceBook()
    {

        $assign_data=array(
                    'sns_id'=> $this->input->post('sns_id', true),
                    'sns_type'=>$this->input->post('sns_type', ture),
                    'profile_img'=>$this->input->post('profile_img', true),
                    'nickname'=>$this->input->post('nickname', true),
                    'email'=>$this->input->post('email', true),
                    'userid'=>''
         );
           
         $this->_register_action($assign_data);

    } 

 

 

 

 

login_form_v.php

 

1. 현재 페이북이 로그인 상태가 아닌경우.

// This is called with the results from from FB.getLoginStatus().
  function statusChangeCallback(response) {
    console.log('statusChangeCallback');
    console.log(response);
    // The response object is returned with a status field that lets the
    // app know the current login status of the person.
    // Full docs on the response object can be found in the documentation
    // for FB.getLoginStatus().
    if (response.status === 'connected') {
      // 페이스북에 로그인 중이라면  testAPI()  실행 
      testAPI();
      
    } else {
     //페이스북에 로그인 중이 아니라면 다음을 실행
     //여기에서 로그인 버튼을 만들어서 화면에 붙인다.
    var loginHtml ='<a href="javascript:fbLogin();"'+ 
    'class="btn btn-block btn-social btn-facebook"> <i class="fa fa-facebook"></i>페이스북으로 로그인</a>' +
    ' <p></p> ' ;   
   
    document.getElementById('status').innerHTML =loginHtml;     
    }
  }

 

2. 현재 웹사이트에 로그인 되어서 세션이 생성 된경우 리다이렉트 처리

3. 페이스북은 로그인 상태이지만  아직 클라이언트 웹에서는 로그인 전 상태일 경우 처리

              <p></p><?php 
   $attribute=array( 'id'=>'facebookFrom');
    echo form_open('/index.php/auth/registerFaceBook',$attribute);
?>
            <input type='hidden' name='sns_id' id="sns_id" >
            <input type='hidden' name='sns_type' id="sns_type">
            <input type='hidden' name='nickname' id="nickname">
            <input type='hidden' name='profile_img' id="profile_img">
            <input type='hidden' name='email' id="email">
    <div id="status"></div>
    </form><p></p>             

 

<?php      
           if($this->session->userdata('logged_in')==TRUE){
               //1.현재 로그인 중이라면 메인으로 리다이렉트
            ?>
           location.href="/";
       <?php        
           }
           else {
               
               //2. 페이스북에는 로그인 되었으나 macaronics 에는 로그인 안 된 경우
        ?>       
        var loginHtml ='<button class="btn btn-block btn-social btn-facebook" id="fbLogin"> ';
        loginHtml += ' <i class="fa fa-facebook"></i>페이스북으로 로그인</btton>' ;

        document.getElementById('status').innerHTML =loginHtml; 
              $("#sns_id").val(response.id);
              $("#sns_type").val('facebook');
              $("#nickname").val(response.name);
              $("#profile_img").val(response.public_profile);
              $("#email").val(response.email);
             if(faceBooKLoginStatus) $("#facebookFrom").submit();  
      <?php         
           }
      ?>   

 

전체 코드

<!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>

   var faceBooKLoginStatus=false;
  // This is called with the results from from FB.getLoginStatus().
  function statusChangeCallback(response) {
    console.log('statusChangeCallback');
    console.log(response);
    // The response object is returned with a status field that lets the
    // app know the current login status of the person.
    // Full docs on the response object can be found in the documentation
    // for FB.getLoginStatus().
    if (response.status === 'connected') {
      // 페이스북에 로그인 중이라면  testAPI()  실행 
      testAPI();
      
    } else {
     //페이스북에 로그인 중이 아니라면 다음을 실행
     //여기에서 로그인 버튼을 만들어서 화면에 붙인다.
    var loginHtml ='<a href="javascript:fbLogin();"'+ 
    'class="btn btn-block btn-social btn-facebook"> <i class="fa fa-facebook"></i>페이스북으로 로그인</a>' +
    ' <p></p> ' ;   
   
    document.getElementById('status').innerHTML =loginHtml;     
    }
  }

  // This function is called when someone finishes with the Login
  // Button.  See the onlogin handler attached to it in the sample
  // code below.
  function checkLoginState() {
    FB.getLoginStatus(function(response) {
       statusChangeCallback(response);
   
    
    });
  }

  window.fbAsyncInit = function() {
  FB.init({
    appId      : '1408521035928580',
    cookie     : true,  // enable cookies to allow the server to access 
                        // the session
    xfbml      : true,  // parse social plugins on this page
    version    : 'v2.8' // use graph api version 2.8
    
  });

    FB.getLoginStatus(function(response) {
       statusChangeCallback(response);
            console.log(" 상태 정보 출력 :" + JSON.stringify(response));
    });     
         
  };

  // Load the SDK asynchronously
(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/ko_KR/sdk.js#xfbml=1&version=v2.10&appId=1408521035928580";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));

  // Here we run a very simple test of the Graph API after login is
  // successful.  See statusChangeCallback() for when this call is made.
  function testAPI() {
    // 로그인이 성공시 다음 아래 코드에서 실행 하면 된다.
    
    console.log('Welcome!  Fetching your information.... ');
    FB.api('/me', { locale: 'ko_KR', fields: 'name, email' } ,function(response) {
     
     //여기서 부터 DB 정보 연결 코딩을 환경에 맞게 개발을 하면 된다.
     // DB 에서 id 또는 email 에서 저장된 동일한 email 있을 경우 저장된 정보 불러 오고 없으면 
     // 새롭게 등록한다.  
     
      console.log('Successful login for: ' + response);
      console.log(' 출력 :  ' + JSON.stringify(response));
  
      <?php      
           if($this->session->userdata('logged_in')==TRUE){
               //1.현재 로그인 중이라면 메인으로 리다이렉트
            ?>
           location.href="/";
       <?php        
           }
           else {
               
               //2. 페이스북에는 로그인 되었으나 macaronics 에는 로그인 안 된 경우
        ?>       
        var loginHtml ='<button class="btn btn-block btn-social btn-facebook" id="fbLogin"> ';
        loginHtml += ' <i class="fa fa-facebook"></i>페이스북으로 로그인</btton>' ;

        document.getElementById('status').innerHTML =loginHtml; 
              $("#sns_id").val(response.id);
              $("#sns_type").val('facebook');
              $("#nickname").val(response.name);
              $("#profile_img").val(response.public_profile);
              $("#email").val(response.email);
             if(faceBooKLoginStatus) $("#facebookFrom").submit();  
      <?php         
           }
      ?>   


     });
  }

 function fbLogin(){

    FB.login(function(response){
  // Handle the response object, like in statusChangeCallback() in our demo
  // code.     
        faceBooKLoginStatus=true;
       checkLoginState();
    }, {scope: 'public_profile , email '});

} 

</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">
        <form accept-charset="UTF-8" role="form" method="post" action="">
        <?php 
        	$attribute=array(
					'class' => 'form-horizontal',
					'id'=>'auth_login',
					'method' =>'post'
			);
			echo form_open('/auth/login'.empty($returnURL) ? '' : '?returnURL='.rawurlencode($returnURL), $attribute);
        	
        ?> 	
        	
        	
            <legend>로그인</legend>
            
				<input type="hidden"  name="con_ip" value='<?php echo $_SERVER['REMOTE_ADDR']; ?>'  >
				<input type="hidden"  name="SERVER_PORT" value="<?php echo $_SERVER['SERVER_PORT']; ?>"  >
				<input type="hidden" name="HTTP_USER_AGENT" value="<?php echo $_SERVER['HTTP_USER_AGENT']; ?>"  >				    
            <div class="form-group">
                <label for="username-email">아이디</label>
                <input name="userid" value='<?php echo set_value("user_id"); ?>' id="username-email" placeholder="아이디" type="text" class="form-control" />
            </div>
            <div class="form-group">
                <label for="password">비밀번호</label>
                <input name="password" id="password" value='<?php echo set_value("user_id"); ?>' placeholder="Password" type="password" class="form-control" />
            </div>
            <div class="form-group">
                <input type="submit" class="btn btn-default btn-login-submit btn-block m-t-md" value="로그인" />
            </div>
           
                       <span class='text-center'><a href="/bbs/index.php?mid=index&act=dispMemberFindAccount" class="text-sm">비밀번호 찾기</a></span>
            <hr />
            <div class="form-group">
                <a href="/index.php/user/register/" class="btn btn-default btn-block m-t-md"> 회원가입</a> 
               <!-- <a href="javascript:alert('관리자 권한이 필요합니다.')" class="btn btn-default btn-block m-t-md"> 회원가입</a> -->
            </div>
        </form>
                
                <h2 class="text-center">간편로그인</h2>
              <div style="margin-top:20px; padding-top:10px; border-top:1px solid #b2dba1;">
                <?=$btn_gg_login?>
                
                <p></p><?php 
   $attribute=array( 'id'=>'facebookFrom');
    echo form_open('/index.php/auth/registerFaceBook',$attribute);
?>
            <input type='hidden' name='sns_id' id="sns_id" >
            <input type='hidden' name='sns_type' id="sns_type">
            <input type='hidden' name='nickname' id="nickname">
            <input type='hidden' name='profile_img' id="profile_img">
            <input type='hidden' name='email' id="email">
    <div id="status"></div>
    </form><p></p>             
                
                <?=$btn_tw_login?>
                <?=$btn_kk_login?>
            </div>

          </div>
          <div class="col-md-4">
         </div>	
        </div>
      </div>
    </div>



  
  </body>
  </html>

 

 

 

 

 

about author

PHRASE

Level 60  머나먼나라

이가 없으면 잇몸으로 살지 , 꼭 있어야 할 것이 없으면 없는 대로 견디어 나갈 수 있다는 말.

댓글 ( 4)

댓글 남기기

작성