그누보드4 SNS로그인 설치를 했는데 로그인이 안됩니다.

그누보드4 SNS로그인 설치를 했는데 로그인이 안됩니다.

QA

그누보드4 SNS로그인 설치를 했는데 로그인이 안됩니다.

본문

일단 그누보드4에 대한 질문을 드려서 죄송합니다.

개발된것이 그누보드4에 개발이 되어있는 상태라 어쩔수없이 그누보드4에 그누보드5에 기본 적용되어있는 SNS로그인을 연동하였는데요.

 

 

일단 제가 작업한것을 말씀드리면

- plugin/social 폴더 skin/social 폴더 복사 후 G5변수를 모두 G4맞게 수정

- g4_member_social_profile 테이블생성

- lib/common.lib.php에서 g4에 없는 g5 스크립트 추가.

 

 

회원가입은 잘 작동되는데 로그인을 하려고하면 로그인이 안되고 있습니다.

로그인을 하면 무조건 회원가입 페이지로 넘어가지네요..

 

 

제 개인적인 생각으로는 plugin/social/includes/functions.php파일에서 

function social_check_login_before($p_service=''){ 이 부분에서 제대로 기능이 안먹히고 있는것 같습니다.

 


        //소셜로 이미 가입 했다면 로그인 처리 합니다.
        if( $user_provider = social_get_data('provider', $provider_name, $user_profile) ){
 
            if( $is_member ){
                $msg = "이미 로그인 하셨거나 잘못된 요청입니다.";
                
                if( $mylink ){
                    $msg = "이미 연결된 아이디가 있거나, 잘못된 요청입니다.";
                }
 
                if( $use_popup == 1 || ! $use_popup ){   //팝업이면
                    alert_close( $msg );
                } else {
                    alert( $msg );
                }
 
                if( is_object( $adapter ) ){    //연결한것은 인증 받은 즉시 로그아웃한다.
                    social_logout_with_adapter($adapter);
                }
                exit;
            }
 
            //데이터가 틀리면 데이터를 갱신 후 로그인 처리 합니다.
            $mb_id = $user_provider['mb_id'];
            //이미 소셜로 가입된 데이터가 있다면 password를 필요하지 않으니, 패스워드를 무작위 생성하여 넘깁니다.
            $mb_password = sha1( str_shuffle( "0123456789abcdefghijklmnoABCDEFGHIJ" ) );
 
            echo social_return_from_provider_page( $provider_name, $login_action_url, $mb_id, $mb_password, $url, $use_popup );
            exit;
 
        //소셜 데이터와 회원데이터가 일치 하는 경우 계정와 연결할지, 새로 계정을 만들지 선택합니다.
        }
        

 

 

혹시 여기서 수정해야할 부분이 있을까요?

테스트페이지 : http://spossam.mireene.com/bbs/login.php

(현재 카카오톡 로그인만 가능합니다)

 

 

 

 

혹시 몰라 functions.php파일 전문 올립니다.
[code]

<?php

 

function get_social_skin_path(){

    global $config;

 

    static $skin_path = '';

 

    if( $skin_path ){

        return $skin_path;

    }

 

    if( ! ($skin_path && is_dir($skin_path)) ){

        $skin_path = G4_SOCIAL_SKIN_PATH;

    }

 

    return $skin_path;

}

 

function get_social_skin_url(){

 

    $skin_path = get_social_skin_path();

 

    return str_replace(G4_PATH, G4_URL, $skin_path);

}

 

function get_social_convert_id($identifier, $service)

{

    return strtolower($service).'_'.hash('adler32', md5($identifier));

}

 

function get_social_callbackurl($provider, $no_domain=false){

 

    $base_url = G4_SOCIAL_LOGIN_BASE_URL;

 

    if ( $provider === 'twitter' ){

        return $base_url;

    }

 

    $base_url = $base_url . ( strpos($base_url, '?') ? '&' : '?' ).G4_SOCIAL_LOGIN_DONE_PARAM.'='.$provider;

 

    return $base_url;

 

}

 

function social_return_from_provider_page( $provider, $login_action_url, $mb_id, $mb_password, $url, $use_popup=2 ){

 

    $ref = $_SERVER['HTTP_REFERER'];

 

    if( !G4_SOCIAL_USE_POPUP || strpos($ref, 'login_check.php') !== false ){

        if( get_session('social_login_redirect') ){

            unset($_SESSION['social_login_redirect']);

            goto_url(G4_BBS_URL.'/login.php?url='.urlencode($url));

        } else {

            set_session('social_login_redirect', 1);

        }

    }

    

    $img_url = G4_SOCIAL_LOGIN_URL.'/img/';

    include_once(G4_SOCIAL_LOGIN_PATH.'/includes/loading.php');

}

 

/**

* Returns hybriauth idp adapter.

*/

function social_login_get_provider_adapter( $provider )

{

    global $g4;

 

    if( ! class_exists( 'Hybrid_Auth', false ) )

    {

        include_once G4_SOCIAL_LOGIN_PATH . "/Hybrid/Auth.php";

    }

 

    if( ! is_object($g4['hybrid_auth']) ){

        $setting = social_build_provider_config($provider);

        $g4['hybrid_auth'] = new Hybrid_Auth( $setting );

    }

 

    //$newsession  = $g4['hybrid_auth']->getSessionData();

 

    if( defined('G4_SOCIAL_LOGIN_START_PARAM') && G4_SOCIAL_LOGIN_START_PARAM === 'hauth.start' && G4_SOCIAL_LOGIN_DONE_PARAM === 'hauth.done' ){

        return $g4['hybrid_auth']->authenticate($provider);

    }

    

    $base_url = G4_SOCIAL_LOGIN_BASE_URL;

    $hauth_time = time();

 

    $connect_data = array(

            'login_start' => $base_url . ( strpos($base_url, '?') ? '&' : '?' ) . G4_SOCIAL_LOGIN_START_PARAM.'='.$provider.'&hauth.time='.$hauth_time,

            'login_done'  => $base_url . ( strpos($base_url, '?') ? '&' : '?' ) . G4_SOCIAL_LOGIN_DONE_PARAM.'='.$provider,

    );

 

    return $g4['hybrid_auth']->authenticate($provider, $connect_data);

}

 

function social_before_join_check($url=''){

    global $g4, $config;

 

    if( $provider_name = social_get_request_provider() ){


 

        //재가입 방지

        if( $user_profile = social_session_exists_check() ){

 

            $sql = sprintf("select * from g4_member_social_profiles where provider = '%s' and identifier = '%s' ", $provider_name, $user_profile->identifier);

 

            $is_exist = false;

 

            $row = sql_fetch($sql);

 

            if( $row['provider'] ){

                $is_exist = true;

 

                $time = time() - (86400 * (int) G4_SOCIAL_DELETE_DAY);

                

                if( empty($row['mb_id']) && ( 0 == G4_SOCIAL_DELETE_DAY || strtotime($row['mp_latest_day']) < $time) ){

 

                    $sql = "delete from g4_member_social_profiles where mp_no =".$row['mp_no'];

 

                    sql_query($sql);

 

                    $is_exist = false;

                }

            }

 

            if( $is_exist ){

                $msg = sprintf("해당 %s ID 로 연결 또는 가입된 내역이 있기 때문에 다시 가입할수 없습니다. 회원이시면 로그인 후 정보 수정에서 계정 연결을 해 주세요.", social_get_provider_service_name($provider_name) );

 

                $url = $url ? $url : G4_URL;

                alert($msg, $url);

                return false;

            }

        }

 

        return true;

    }

 

    return false;

}

 

function social_get_data($by='provider', $provider, $user_profile){

    global $g4;

 

    // 소셜 가입이 되어 있는지 체크

    if( $by == 'provider' ){

        

        //$sql = sprintf("select * from g4_member_social_profiles where provider = '%s' and identifier = '%s' order by mb_id desc ", $provider, $user_profile->identifier);

        $sql = sprintf("select * from g4_member_social_profiles where provider = 'Kakao' and identifier = '%s' order by mb_id desc ", $provider, $user_profile->identifier);

        $row = sql_fetch($sql);

 

        if(!empty($row['mb_id'])){    

            return $row;    //mb_id 가 있는 경우에만 데이터를 리턴합니다.

        }

 

        return false;

    } 

 

    else if ( $by == 'member' ){  // 아이디 또는 이메일이나 별명으로 이미 가입되어 있는지 체크

 

        $email = ($user_profile->emailVerified) ? $user_profile->emailVerified : $user_profile->email;

        $sid = preg_match("/[^0-9a-z_]+/i", "", $user_profile->sid);

        $nick = social_relace_nick($user_profile->displayName);

        if( !$nick ){

            $tmp = explode("@", $email);

            $nick = $tmp[0];

        }

 

        $sql = "select mb_nick, mb_email from g4_member where mb_nick = '".$nick."' ";

 

        if( !empty($email) ){

            $sql .= sprintf(" or mb_email = '%s' ", $email);

        }

 

        $result = sql_query($sql);

 

        $exists = array();

 

        while($row=sql_fetch_array($result)){

            if($row['mb_nick'] && $row['mb_nick'] == $nick){

                $exists['mb_nick'] = $nick;

            }

            if($row['mb_email'] && $row['mb_email'] == $email){

                $exists['mb_email'] = $email;

            }

        }

 

        return $exists;

 

    }

 

    return null;

}

 

function social_user_profile_replace( $mb_id, $provider, $profile ){

    global $g4;

 

    if( !$mb_id )

        return;

 

    // $profile 에 성별, 나이, 생일 등의 정보가 포함되어 있습니다.

 

    //받아온 정보를 암호화 하여

    $object_sha = sha1( serialize( $profile ) );

    

    $provider = strtolower($provider);

 

    $sql = sprintf("SELECT mp_no, mb_id from g4_member_social_profiles where provider= '%s' and identifier = '%s' ", $provider, $profile->identifier);

    $result = sql_query($sql);

    for($i=0;$row=sql_fetch_array($result);$i++){   //혹시 맞지 않는 데이터가 있으면 삭제합니다.

        if( $row['mb_id'] != $mb_id ){

           sql_query(sprintf("DELETE FROM g4_member_social_profiles where mp_no=%d", $row['mp_no']));

        }

    }

    

    $sql = sprintf("SELECT mp_no, object_sha, mp_register_day from g4_member_social_profiles where mb_id= '%s' and provider= '%s' and identifier = '%s' ", $mb_id, $provider, $profile->identifier);

 

    $row = sql_fetch($sql);

 

    $table_data = array(

        "mp_no"    =>  ! empty($row) ? $row['mp_no'] : 'NULL',

        'mb_id' =>  "'". $mb_id. "'",

        'provider'  => "'".  $provider . "'",

        'object_sha'    => "'". $object_sha . "'",

        'mp_register_day' => ! empty($row) ? "'".$row['mp_register_day']."'" : "'". G4_TIME_YMDHIS . "'",

        'mp_latest_day' => "'". G4_TIME_YMDHIS . "'",

    );

 

    $fields = array( 

        'identifier',

        'profileurl',

        'photourl',

        'displayname',

        'description',

    );

 

    foreach( (array) $profile as $key => $value ){

        $key = strtolower($key);

 

        if( in_array( $key, $fields ) )

        {

            $value = (string) $value;

            $table_data[ $key ] = "'". sql_real_escape_string($value). "'";

        }

    }

    

    $fields  = '`' . implode( '`, `', array_keys( $table_data ) ) . '`';

    $values = implode( ", ", array_values( $table_data )  );

 

    $sql = "REPLACE INTO g4_member_social_profiles ($fields) VALUES ($values) ";

 

    sql_query($sql);

 

    return sql_insert_id();

 

}

 

function social_build_provider_config($provider){

    $setting = array(

        'base_url'  =>  https_url(G4_PLUGIN_DIR.'/'.G4_SOCIAL_LOGIN_DIR).'/',

        'providers' =>  array(

            $provider   =>  array(

                    'enabled'   => true,

                    'keys'  =>  array( 'id' => null, 'key' => null, 'secret' => null )

                )

            ),

        );

 

    if( function_exists('social_extends_get_keys') ){

        $setting['providers'][$provider] = social_extends_get_keys($provider);

    }

 

    if(defined('G4_SOCIAL_IS_DEBUG') && G4_SOCIAL_IS_DEBUG){

        $setting['debug_mode'] = true;

        $setting['debug_file'] = G4_DATA_PATH.'/tmp/social_'.md5($_SERVER['SERVER_SOFTWARE'].$_SERVER['SERVER_ADDR']).'_'.date('ymd').'.log';

    }

 

    return $setting;

}

 

function social_extends_get_keys($provider){

 

    global $config;

 

    static $r = array();

 

    if ( empty($r) ) {

 

        // Naver

        $r['Naver'] = array(

                    "enabled" => true,

                    "redirect_uri" => get_social_callbackurl('naver'),

                    "keys" => array("id" => "QSsjgcTZaPfZCirupyu6", "secret" => "J68BiVjqAp",),

                );

 

        // Kakao

        $r['Kakao'] = array(

                    "enabled" => true,

                    "keys" => array("id" => "0efeb884b354fe11d54ae1a28364bf70", "secret" => "5JLxm9Csd1hOGaXLlEIwars3xFvyyude"),

                    "redirect_uri" => get_social_callbackurl('kakao')

                );

 

        // Facebook

        $r['Facebook'] = array(

                    "enabled" => true,

                    "keys" => array("id" => $config['cf_facebook_appid'], "secret" => $config['cf_facebook_secret']),

                    "display"   =>  "popup",

                    "redirect_uri" => get_social_callbackurl('facebook'),

                    "scope"   => array('email'), // optional

                    "trustForwarded" => false

                );

 

        // Google

        $r['Google'] = array(

                    "enabled" => true,

                    "keys" => array("id" => $config['cf_google_clientid'],

                    "secret" => $config['cf_google_secret']),

                    "redirect_uri" => get_social_callbackurl('google'),

                    "scope"   => "https://www.googleapis.com/auth/plus.login ". // optional

                                    "https://www.googleapis.com/auth/plus.me ". // optional

                                    "https://www.googleapis.com/auth/plus.profile.emails.read", // optional

                    //"access_type"     => "offline",   // optional

                    //"approval_prompt" => "force",     // optional

                );

 

        // Twitter

        $r['Twitter'] = array(

                    "enabled" => option_array_checked('twitter', $config['cf_social_servicelist']) ? true : false,

                    "keys" => array("key" => $config['cf_twitter_key'], "secret" => $config['cf_twitter_secret']),

                    "redirect_uri" => get_social_callbackurl('twitter'),

                    "trustForwarded" => false

                );

 

        // Payco

        $r['Payco'] = array(

                    "enabled" => option_array_checked('payco', $config['cf_social_servicelist']) ? true : false,

                    "keys" => array("id" => $config['cf_payco_clientid'], "secret" => $config['cf_payco_secret']),

                    "redirect_uri" => get_social_callbackurl('payco'),

                    "trustForwarded" => false

                );

    }

 

    return $r[$provider];

}

 

function social_escape_request($request){

    return clean_xss_tags( strip_tags($request) );

}

 

function social_get_request_provider(){

    $provider_name = isset($_REQUEST['provider']) ? ucfirst(social_escape_request($_REQUEST['provider'])) : '';

 

    return $provider_name;

}

 

function social_login_session_clear($mycf=0){

    $_SESSION["HA::STORE"]        = array(); // used by hybridauth library. to clear as soon as the auth process ends.

    $_SESSION["HA::CONFIG"]       = array(); // used by hybridauth library. to clear as soon as the auth process ends.

    set_session('sl_userprofile', '');

    set_session('social_login_redirect', '');

    if(!$mycf){

        set_session('ss_social_provider', '');

    }

}

 

function social_session_exists_check(){

 

    $provider_name = social_get_request_provider();

 

    if(!$provider_name){

        return false;

    }

 

    if( $provider_name && isset($_SESSION['HA::STORE']['hauth_session.'.strtolower($provider_name).'.is_logged_in']) && !empty($_SESSION['sl_userprofile'][$provider_name]) ){

        return json_decode($_SESSION['sl_userprofile'][$provider_name]);

    }

 

    return false;

}

 

function social_relace_nick($nick=''){

 

    if( empty($nick) ) return '';

 

    return preg_replace("/[ #\&\+\-%@=\/\\\:;,\.'\"\^`~\_|\!\?\*$#<>()\[\]\{\}]/i", "", $nick);

}

 

function social_get_error_msg($type){

    ob_start();

 

    switch( $type ){

      case 0 : echo "지정되지 않은 오류입니다."; break;

      case 1 : echo "설정 오류입니다."; break;

      case 2 : echo "해당 provider 설정 오류입니다."; break;

      case 3 : echo "알수 없거나 비활성화 된 provider 입니다."; break;

      case 4 : echo "해당 서비스에 접근할수 있는 권한이 없습니다."; break;

      case 5 : echo "인증이 실패되었습니다.. "

                  . "사용자가 인증을 취소했거나, 공급자가 연결을 거부했습니다.";

               break;

      case 6 : echo "사용자 프로필 요청이 실패했습니다.사용자가 해당 서비스에 연결되어 있지 않을 경우도 있습니다. "

                  . "이 경우 다시 인증 요청을 해야 합니다.";

               break;

      case 7 : echo "사용자가 해당 서비스에 연결되어 있지 않습니다.";

               break;

      case 8 : echo "해당 서비스가 기능을 지원하지 않습니다."; break;

    }

    

    $get_error = ob_get_clean();

 

    return $get_error;

}

 

if( !function_exists('replaceQueryParams') ){

    function replaceQueryParams($url, $params)

    {

        $query = parse_url($url, PHP_URL_QUERY);

        parse_str($query, $oldParams);

 

        if (empty($oldParams)) {

            return rtrim($url, '?') . '?' . http_build_query($params);

        }

 

        $params = array_merge($oldParams, $params);

 

        return preg_replace('#\?.*#', '?' . http_build_query($params), $url);

    }

}

 

function social_loading_provider_page( $provider ){

    

    social_login_session_clear(1);

 

    define('G4_SOCIAL_IS_LOADING', TRUE );

 

    $login_action_url = G4_URL;

 

    $img_url = G4_SOCIAL_LOGIN_URL.'/img/';

    include_once(G4_SOCIAL_LOGIN_PATH.'/includes/loading.php');

}

 

function social_check_login_before($p_service=''){

    global $is_member, $member;

 

    $action = isset( $_REQUEST['action'] ) ? social_escape_request($_REQUEST['action']) : '';

    $provider_name = $p_service ? $p_service : social_get_request_provider();

    $url = isset($_REQUEST['url']) ? $_REQUEST['url'] : G4_URL;

    $mode = isset($_REQUEST['mode']) ? $_REQUEST['mode'] : 'login';

    $use_popup = G4_SOCIAL_USE_POPUP ? 1 : 2;

    $ss_social_provider = get_session('ss_social_provider');

 

    if( $provider_name ){


 

        if( ! isset( $_REQUEST["redirect_to_idp"] ) )

        {

            return social_loading_provider_page( $provider_name );

        }

 

        try

        {

            $adapter = social_login_get_provider_adapter( $provider_name );

            

            // then grab the user profile 

            $user_profile = $adapter->getUserProfile();

 

            if( ! (isset($_SESSION['sl_userprofile']) && is_array($_SESSION['sl_userprofile'])) ){ 

                $_SESSION['sl_userprofile'] = array(); 

            }

 

            if( ! $is_member ){ 

                $_SESSION['sl_userprofile'][$provider_name] = json_encode( $user_profile );

            }

        }

 

        catch( Exception $e )

        {

            $get_error = social_get_error_msg( $e->getCode() );

 

            if( is_object( $adapter ) ){

                $adapter->logout();

            }

 

            include_once(G4_SOCIAL_LOGIN_PATH.'/error.php');

            exit;

        }

 

        $register_url = G4_BBS_URL.'/register_form.php?provider='.$provider_name;

        $register_action_url = G4_BBS_URL.'/register_form_update.php';

 

        $login_action_url = G4_BBS_URL."/login_check.php";

        $mylink = (isset($_REQUEST['mylink']) && !empty($_REQUEST['mylink'])) ? 1 : 0;





 

        //소셜로 이미 가입 했다면 로그인 처리 합니다.

        if( $user_provider = social_get_data('provider', $provider_name, $user_profile) ){

 

            if( $is_member ){

                $msg = "이미 로그인 하셨거나 잘못된 요청입니다.";

                

                if( $mylink ){

                    $msg = "이미 연결된 아이디가 있거나, 잘못된 요청입니다.";

                }

 

                if( $use_popup == 1 || ! $use_popup ){   //팝업이면

                    alert_close( $msg );

                } else {

                    alert( $msg );

                }

 

                if( is_object( $adapter ) ){    //연결한것은 인증 받은 즉시 로그아웃한다.

                    social_logout_with_adapter($adapter);

                }

                exit;

            }

 

            //데이터가 틀리면 데이터를 갱신 후 로그인 처리 합니다.

            $mb_id = $user_provider['mb_id'];

            //이미 소셜로 가입된 데이터가 있다면 password를 필요하지 않으니, 패스워드를 무작위 생성하여 넘깁니다.

            $mb_password = sha1( str_shuffle( "0123456789abcdefghijklmnoABCDEFGHIJ" ) );

 

            echo social_return_from_provider_page( $provider_name, $login_action_url, $mb_id, $mb_password, $url, $use_popup );

            exit;

 

        //소셜 데이터와 회원데이터가 일치 하는 경우 계정와 연결할지, 새로 계정을 만들지 선택합니다.

        }

        

 

       

        else {

 

            if( $is_member && !empty($user_profile) ){   //회원이면

                

                if( $mylink ){

 

                    social_user_profile_replace($member['mb_id'], $provider_name, $user_profile);

 

                    if( is_object( $adapter ) ){    //연결한것은 인증 받은 즉시 로그아웃한다.

                        social_logout_with_adapter($adapter);

                    }

                    

                    // 세션에 소셜정보가 없으면 연결된 소셜서비스를 저장합니다.

                    if( ! get_session('ss_social_provider') ){

                        set_session('ss_social_provider', $provider_name);

                    }

 

                    if( $use_popup == 1 || ! $use_popup ){   //팝업이면

                    ?>

                    <script>

                        if( window.opener )

                        {

                            window.close();

                            if (typeof window.opener.social_link_fn != 'undefined')

                            {

                                window.opener.social_link_fn("<?php echo $provider_name; ?>");

                            }

                        }

                    </script>

                    <?php

                    } else {

                        if( $url ){

                            $social_token = social_nonce_create($provider_name);

                            set_session('social_link_token', $social_token);

                            

                            $params = array('provider'=>$provider_name);

 

                            $url = replaceQueryParams($url, $params);

                            goto_url($url);

                        } else {

                            goto_url(G4_URL);

                        }

                    }

                    exit;

                }

 

                goto_url(G4_URL);

            }

 

            if( !( property_exists($user_profile, 'sid') && !empty($user_profile->sid) ) ){

                $msg = '소셜 데이터 오류';

                if( $use_popup == 1 || ! $use_popup ){   //팝업이면

                    alert_close($msg);

                } else {

                    alert($msg);

                }

            }

 

            // 회원이 아닌 경우에만 아래 실행

            $register_url = G4_SOCIAL_LOGIN_URL.'/register_member.php?provider='.$provider_name;

 

            if( $url ){

                $register_url .= '&url='.urlencode($url);

            }

 

            if( $use_popup == 1 || ! $use_popup ){   //팝업이면

            ?>

                <script>

                    if( window.opener )

                    {

                        window.close();

 

     &am

이 질문에 댓글 쓰기 :

답변을 작성하시기 전에 로그인 해주세요.
전체 123,165 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT