안녕하세요. 이번 글에서는 XE(XpressEngine)로 구현된 홈페이지에서 외부 로그인을 구현하는 방법을 알아보도록 하겠습니다. 먼저, 외부 로그인을 구현하기 전에 XE의 로그인 진행 함수에 대해 알아야 하는데, 바로 아래에서 코드를 설명 드리겠습니다. 로그인 폼으로 단순히 서버에 값만 넘겨주는 함수는 dispMemberLoginForm이고 로그인을 실제 진행하는 함수는 procMemberLogin입니다.



아래는 ./modules/member/member.controller.php 내에 있는 procMemberLogin function의 일부입니다.


function procMemberLogin($user_id = null, $password = null, $keep_signed = null)
{
       if(!$user_id && !$password && Context::getRequestMethod() == 'GET')
       {
              $this->setRedirectUrl(getNotEncodedUrl(''));
              return new Object(-1, 'null_user_id');
       }
       // Variables
       if(!$user_id) $user_id = Context::get('user_id');
       $user_id = trim($user_id);

       if(!$password) $password = Context::get('password');
       $password = trim($password);
       if(!$keep_signed) $keep_signed = Context::get('keep_signed');

       // Return an error when id and password doesn't exist
       if(!$user_id) return new Object(-1,'null_user_id');
       if(!$password) return new Object(-1,'null_password');

       $output = $this->doLogin($user_id, $password, $keep_signed=='Y'?true:false);
       if (!$output->toBool()) return $output;



가장 윗줄의 if(!$user_id && !$password && Context::getRequestMethod() == 'GET') 은 HTTP 요청 방식이 GET이면 처리하지 않겠다는 말이죠. GET은 우리가 일반적으로 사용하는 방식인데 입력받은 값이 그대로 주소창에 노출되기 때문에 보안상 위험합니다. 한마디로 URL을 이용한 자동 로그인을 막겠다는 이야기이죠. 참고로 XE 1.5버전부터 바뀐 것입니다. 그래도 방법은 있습니다. 아주 많이요. 또, 사용자 아이디는 user_id, 비밀번호는 password 변수를 사용하는 것을 알 수 있습니다.


1. HTML


<html>
<head>
</head>
<body>
<form action="http://사이트주소/?act=procMemberLogin" method="post">
아이디: <input type="text" name="user_id" required="required"><br>
비밀번호: <input type="password" name="password" required="required"><br>
<input type="submit" value="Submit">
</form>
</body>
</html>



위 코드에서 보다시피 요청 방식이 POST인 것을 알 수 있습니다. POST 방식으로 요청을 전달하면 주소창에 변수(ID, 비밀번호 등)가 표시되지 않게 됩니다. 위 소스를 저장하고 아이디와 비밀번호를 입력한 후 Submit 버튼을 클릭하면 로그인이 되면서 홈페이지 메인으로 가는 것을 알 수 있습니다. 단, HTML은 단순 로그인 기능만 가능하기 때문에 로그인 사용자/비로그인 사용자를 판별하려면 아래 PHP를 이용해야 합니다.


2. PHP



PHP로도 가능합니다, 아니 오히려 PHP를 사용하는 것이 더 좋습니다.


<?php
define('__XE__', true);
require_once("./config/config.inc.php");
$oContext = &Context::getInstance();
$oContext->init();

$logged_info = Context::get('logged_info');

if($logged_info) {
       //로그인이 되었을때
} else {
       //로그인이 되지 않았을때
}
?>



위 소스에서는 사이트의 /config/config.inc.php를 요청하는 걸 알 수 있습니다. 이건 로그인 폼은 제공하지 않고 로그인 후에 실행할 동작만 제공합니다. 주석 부분에 원하는 소스를 넣으면 됩니다.

댓글

               
1 ... 6 7 8 9 10 11 12 13 14 ... 79