Codeigniter

Codeigniter SNS(Facebook, Google, Twitter, Kakao, Naver) 연동 ***** 중요 ******

 

위에서 소스를 다운 받는다.

Auth 컨트롤러 에서 echo 를 지우고 트위터 에서 받아온 정보를 DB에 저장후 세션에 로그인 처리로 연동 시키는 작업을 한다.

 

// Twitter Redirect URL
    public function twitter_redirect() {
        
        require_once realpath(dirname(__FILE__).'/../libraries/SNS_OAuth/').'/twitter_oauth.php';

        $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
        $request_token = $connection->getRequestToken(OAUTH_CALLBACK);

        $_SESSION['oauth_token'] = $token = $request_token['oauth_token'];
        $_SESSION['oauth_token_secret'] = $request_token['oauth_token_secret'];
         
        switch ($connection->http_code) {
            case 200:
                $url = $connection->getAuthorizeURL($token);
                header('Location: ' . $url); 
                break;
            default:
                echo 'Could not connect to Twitter. Refresh the page or try again later.';
        }
    }


    // Twitter Login Action Process
    public function twitter_login_action() {

        require_once realpath(dirname(__FILE__).'/../libraries/SNS_OAuth/').'/twitter_oauth.php';

        if (isset($_REQUEST['oauth_token']) && $_SESSION['oauth_token'] !== $_REQUEST['oauth_token']) {
            $this->script->alert("Invalid OAuth Token.");
            $this->script->locationhref('/login');
        }

        $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);
        $access_token = $connection->getAccessToken($_REQUEST['oauth_verifier']);

        $_SESSION['access_token'] = $access_token;

        unset($_SESSION['oauth_token']);
        unset($_SESSION['oauth_token_secret']);

        if (200 == $connection->http_code) {

            $_SESSION['status'] = 'verified';

            $content = $connection->get('account/verify_credentials');

            // Add Code :: Valid Member
            // if exists member -> go main
              
          
            $assign_data=array(
                    'sns_id'=> $content->id,
                    'sns_type'=>'twitter',
                    'profile_img'=>$content->profile_image_url,
                    'nickname'=>$content->name,
                    'email'=>'',
                    'userid'=>''
             );
            
            $this->_register_action($assign_data);
           
       /*
            echo "<form method='post' name='submit_form' action=''>";
                   echo "<input type='hidden' name='sns_id' value='".$content->id."'>";
                   echo "<input type='hidden' name='sns_type' value='twitter'>";
                   echo "<input type='hidden' name='name' value='".$content->name."'>";
                   echo "<input type='hidden' name='screen_name' value='".$content->screen_name."'>";
                   echo "<input type='hidden' name='profile_img' value='".$content->profile_image_url."'>";
                   echo "</form>";
                   echo "<script>document.submit_form.submit();</script>";
       */

        } else {
            $this->script->alert("Invailed Access.");
            $this->script->locationhref('/login');
        }
    }

 

다음 아래와 같은 코드를 환경에 맞게 개발 처리 한다.

기존에 등록된 유저가 있는지 확인 한다. 이메일 있을 경우 반환 또는 트위터에 이메일을 입력하지 않은 경우가 있기 때문에

이메일 대신 아이디에 데이터를 저장처리한다.

저장된 데이터가 있을 경우에는 기존에 데이터에서 다시 정보를 불러와 필요한 것만 로그인을 위한 세션에 저장 시킨다.

 

 
    // 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;
         }                            
    }

 

 

 

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  머나먼나라

남자는 늘 여자의 첫째 애인이 되고 싶어하지만 그것은 어리석은 허영심이다. 여자는 보다 더 빈틈없는 본능을 갖고 있다. 여자가 바라는 것은 남자의 마지막 애인이 되는 것이다. -오스카 와일드

댓글 ( 4)

댓글 남기기

작성