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

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

QA

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

답변 2

본문

일단 그누보드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

이 질문에 댓글 쓰기 :

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
전체 200
© SIRSOFT
현재 페이지 제일 처음으로