그누보드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')
);
$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
);
$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
);
$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
!-->