워드프레스, 그누보드 연동

현재 길호넷에서 워드프레스와 그누보드를 연동한 방식입니다.

사이트를 좀 더 안정화를 시킨 후 소스를 공개하려고 하였는데, 그누보드 사용자분의 요청(?)으로 급조하여 만든걸 올립니다. (http://sir.co.kr/bbs/board.php?bo_table=cm_free&wr_id=741180)

추후, 그누보드의 head.php, tail.php 에서 워드프레스에서 생성된 페이지를 직접 불러들이고, 캐쉬 처리 및 컨텐츠 영역을 상하로 나눈 후 출력하는것을 생각하고 있습니다.

– 워드프레스 회원 DB 를 기반으로 그누보드와 연동되어, 게시판 글 작성시 워드프레스의 로그인에 따라 액션을 취합니다.
– 그누보드를 gnu.kilho.net 로 사용하고 있습니다. 따라서 워드프레스에서 서브도메인과 쿠키를 공유할 수 있게 하여야 합니다.
(길호넷에서는 “root Cookie” 라는 플러그인을 사용하였습니다)
– 워드프레스와 그누보드가 각각의 서버로 운영되고 있습니다. 소스 내용 중 자신의 워드프레스가 설치된 서버IP, 워드프레스가 설치된 도메인 정보를 각각 수정하세요.
– 워드프레스가 설치된 서버에 아래 소스를 “wp-sso.php” 로 저장합니다.

<?
	/********************************************************
	 * WordPress SSO(Single Site On) Helper Object 
	 * by Oh Kilho (http://www.kilho.net)
	 *******************************************************/

	include 'wp-load.php';
	
	$wp_cookie = $_COOKIE&#91;'wordpress_logged_in_'.md5(get_site_option('siteurl'))&#93;;
	$wp_user = $_POST&#91;'user'&#93;;
	$wp_pass = $_POST&#91;'pass'&#93;;

	if($wp_user&&$wp_pass)
	{
		if(user_pass_ok($wp_user, $wp_pass))
			$user = get_user_by('login', $wp_user);
	}else{
		if($wp_cookie)
		{
			wp_set_current_user(wp_validate_auth_cookie($wp_cookie, 'logged_in'));
			$user = wp_get_current_user();
		}
	}

	if($user)
	{
		echo '<id>'.$user->user_login.'</id>';
		echo '<nick>'.$user->display_name.'</nick>';
		echo '<email>'.$user->user_email.'</email>';
		echo '<url>'.$user->user_url.'</url>';
	}
?>

– 그누보드가 설치된 서버의 “/extend/” 디렉토리에 아래 소스를 “wp-sso.php”로 저장합니다.

<?
/*
 그누보드 확장 모듈 : 워드프레스 SSO 처리
 */
$wp_server_domain = '워드프레스 설치된 도메인'; // xxx.com
$wp_server_addr = '워드프레스 설치된 서버 IP'; // xxx.xxx.xxx.xxx
$wp_server_path = '워드프레스 설치된 경로'; // 루트일 땐 '/' 로 작성

$wp_cookie_name = 'wordpress_logged_in_'.md5('http://'.$wp_server_domain);
$wp_cookie_value = $_COOKIE&#91;$wp_cookie_name&#93;;

if ($_SESSION&#91;'ss_mb_id'&#93;)
{
	// 총 관리자인 경우 열외 - 그누보드를 자체적으로 살펴볼 권한을 줘야징
	if(!$wp_cookie_value&&$is_admin != 'super')
	{
		// 이호경님 제안 코드
		session_unset(); // 모든 세션변수를 언레지스터 시켜줌 
		session_destroy(); // 세션해제함 

		// 페이지를 재실행
		echo "<script type='text/javascript'> window.location.reload(); </script>";
		exit;
	}
}else{
	if($wp_cookie_value)
	{
		// 메인 서버에서 정보 취득
		$fp = fsockopen($wp_server_addr,80,$errno,$errstr,3);

		if($fp)
		{
			fputs($fp, "GET {$wp_server_path}wp-sso.php HTTP/1.1\r\n");
			fputs($fp, "Accept: */*\r\n");
			fputs($fp, "Accept-Language: ko\r\n");
			fputs($fp, "User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1)\r\n");
			fputs($fp, "Host: $wp_server_domain\r\n");
			fputs($fp, "Connection: Close\r\n");
			fputs($fp, "Cookie: $wp_cookie_name=$wp_cookie_value\r\n");
			fputs($fp, "\r\n");

			$data = '';
			while(!feof($fp))
			{
				$data .= fgets($fp,1024);
			}

			fclose($fp);

			if($data)
			{
				foreach(array('id', 'nick', 'email', 'url', 'password') as $value)
				{
					preg_match('@<'.$value.'>(.*?)</'.$value.'>@',$data,$matches); 
					$wp_user[$value] = $matches[1];
				}
				$wp_user[pass] = substr(str_shuffle('abcefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'), 0, 12);

				$sql = " select mb_id from $g4[member_table] where mb_id='$wp_user[id]' ";
				$row = sql_fetch($sql);
				if($row[mb_id]!=$wp_user[id])
				{
					$sql = " insert into $g4[member_table]
									set mb_id = '$wp_user[id]',
										mb_password = password('$wp_user[pass]'),
										mb_name = '$wp_user[nick]',
										mb_nick = '$wp_user[nick]',
										mb_email = '$wp_user[email]',
										mb_homepage = '$wp_user[url]',
										mb_datetime = '$g4[time_ymdhis]',
										mb_ip = '$_SERVER[REMOTE_ADDR]',
										mb_level = '$config[cf_register_level]' ";
					sql_query($sql);
				}else{
					$sql = " update $g4[member_table]
									set mb_nick = '$wp_user[nick]',
										mb_email = '$wp_user[email]',
										mb_homepage = '$wp_user[url]'
									where mb_id = '$wp_user[id]' ";
					sql_query($sql);
				}
				unset($row);

				$mb = get_member($wp_user[id]);


				// 회원아이디 세션 생성
				set_session('ss_mb_id', $mb[mb_id]);
				// FLASH XSS 공격에 대응하기 위하여 회원의 고유키를 생성해 놓는다. 관리자에서 검사함 - 110106
				set_session('ss_mb_key', md5($mb[mb_datetime] . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']));

				// 페이지를 재실행
				echo "<script type='text/javascript'> window.location.reload(); </script>";
				exit;
			}
		}else{
			echo 'Connection failed';
			exit;
		}

	}
}
?>
  • 전진

    감사합니다. ^^

  • 정말 감사합니다. ^^

  • MWP

    안녕하세요. SIR에서 링크를 타고 왔습니다.
    워드프레스와 그누 연동 하는데, 조금 어렵네요..ㅠ
    제가 실력이 미천해서 어느 부분 설정이 잘못 되었는지 좀 봐주시면 정말 감사하겠습니다.

    1. gnuboard 폴더 내에 adm,bbs…죽 업로드하고, 서브도메인을 괄호와 같이 생성했습니다. (mydomain.com/gnuboard = gnuboard.mydomain.com)

    2. 워드프레스와 그누보드가 설치된 서버ip는 똑같습니다. DB는 별도로 신규 생성하지 않고, 기존의 DB에 함께 설치되어 있습니다.
    – 다시말하면, 그누보드 세팅시에 DB명을 기존 DB명과 동일하게 설치했습니다.

    3. 워드프레스에서 [root Cookie] 플러그인을 설치하고, 설정을 Allow Cookies to go across All Subdomains에 체크를 했습니다.

    4. 워드프레스가 설치된 FTP루트(wp-admin,wp-content… 폴더 및 파일들이 있는 루트)에 윗부분에 정리하신 wp-sso.php를 생성하여 업로드하였습니다.

    5. 그누보드가 설치된 /gnuboard/extend 폴더에 아래부분에 정리하신 wp-sso.php를 생성하여 업로드하였습니다.

    – 수정 설정한 부분
    $wp_server_domain = ‘mydomain.com’; //워드프레스가 설치된 도메인
    $wp_server_addr = ‘mydomain.com의 ip’; // 워드프레스가 설치된 서버의 IP

    위와 같이 했을 때, 현상이 이렇습니다.
    워드프레스에서 로그인 후에, mydomain.com/gnuboard 또는 gnuboard.mydomain.com 으로 접속했을 때,
    로그인이 되어 있지 않는데, 관련팁을 좀 주시면 감사하겠습니다.

    • 오길호

      mydomain.com/wp-sso.php 로 접속하였을때 404 에러가 뜨지 않는지 확인부탁드립니다.
      그외 말씀 하신대로 하셨다면, 정상적으로 작동이 되야 될텐데 이상하네요.
      (참, 추가 질문은 “질문게시판” 에 올려주세요)

    • 그누테스트

      질문게시판을 보고 해결하였습니다.

      오길호님 연동프로그램 정말 감사하네요. ㅎㅎ

  • 오길호님께 질문을 드릴려고 로그인을 하려니 로그인이 되지 않습니다. 게시판에 글을 쓸수가 없어서 죄송하지만 이곳에 남깁니다.

    제가 5월달에 등록해서 받았던 비번은

    사용자 이름: cshop
    비밀번호: x6rnn9DBwHCi

    이렇게 되는데 로그인도 되지 않고 새 비번도 제 이메일로 발송되지 않네요…. 이메일 주소를 바꿔서 등록을 해도 새로 등록도 되지 않습니다.

    저는 몇년전부터 개인 홈피를 WP 로 쓰고 있었어서 오길호님께서 5월달에 연동 소스를 공개해 주셔서 매우 반가웠는데, 사용은 하지 않았었습니다. 아직 쓸일이 없었어서….

    오늘 설치해보니 작동이 되긴 되는데, 아후.. 제가 한국어가 서툴러서…

    http://hackya.com/dtd/extend/wp-sso.php 여기가 그누보드

    출력되는 것도 없고, 에러메세지도 뜨지 않습니다.

    http://hackya.com/blog/wp-sso.php 여기가 WP 입니다.

    [email protected] (test 가 ID)

    여기서는 로그인 된 value (test) 가 두번 출력됩니다. ㅠㅠ

    저는 css 하고 .js/jQuery 밖에 할줄 아는게 없어서요…. php 는 아주 아주 기초적인 것 밖에 모릅니다. 그래서 이걸 어떻게 해결해야 할지도 모르겠네요….

    저는 예제와 달리 그냥 같은 웹사이트에서 블로그와 DTD (그누보드) 를 돌리고 있어서.. 이런 현상이 일어나는 것 같은데 (제 생각에는), 도움을 부탁드려도 될까요? 꾸벅….

    php 는 아주 기본적인 상식밖에 없는 관계로 제가 해결할 수 있는 부분이 아니라서… ㅠㅠ

    • 오길호

      길호넷을 서비스 받는 웹호스팅에서 메일 발송이 차단 된 듯하여 해당 업체에 문의를 해두었습니다.

      hackya.com 에서 로긴을 하고 확인을 해보려고 헀는데.
      회원가입이 되질 않아서 확인을 못하고 있습니다.

      비밀번호를 메일로 드렸으니, 좀 더 자세하게 질문게시판에 글 남겨주세요

      • 네. 보내주신 로그인 비번을 받아서 질문을 다시 올려 놓았습니다.

        감사합니다.

    • 오길호

      현재 메일발송 서버를 Google SMTP 를 이용하도록 하였습니다.
      사용중인 웹호스팅과 별개로 메일을 발송할 수 있도록 하였으니, 비밀번호 찾기를 하시면 정상적으로 됩니다.
      (모르고 있었는데, 감사합니다 ^^)

  • 감사합니다 🙂