PHP 오픈아이디 구현 방법 (OpenID Consumer)
최광용 Lv. 15 llllllllll 
16614 hit since 2007/09/04 13:57
JanRain, Inc.PHP OpenID Library를 이용하여 OpenID Consumer를 간단하게 구현해보았습니다. 라이브러리 소스 안에있는 examples/ 디렉토리를 보면 이 라이브러리를 이용하여 consumer 및 server를 어떻게 구현하면 되는지 간단한 예제들이 들어있습니다.

우리가 관심있어 하는 부분은 consumer부분일 것입니다. examples/consumer/ 디렉토리의 내용을보면 예제가 잘 나와 있는데, 이 예제를 참고하여 아래와 같이 간단하게 정리해보았습니다. PHP를 이용하여 OpenID 기능을 구현해보고 싶은 사람은 아래 내용이 참고가 될 것입니다. 자세한 사항은 examples/consumer/ 디렉토리의 내용을 참고하기 바랍니다.


1. OpenID URL을 넘겨줄 form

OpenID를 입력하는 폼에서 넘겨줘여 할 값은 다음과 같이 process_url, openid_url 두 가지 입니다. process_url은 OpenID Server에서 인증을 끝내고 돌아올 URL이고, openid_url은 사용할 OpenID 입니다. 간단한 폼의 샘플은 다음과 같습니다.

<form method="get" action="try_auth.php">
<input type="hidden" name="process_url" value="$_url/$_SERVER['PHP_SELF']">
<input type="text" name="openid_url">
<img src="$_openid_image">
</form>


2. 인증 서버로 redirect 하는 try_auth.php

위의 폼을 전송하면 try_auth.php에서 값들을 받아 처리를 한 뒤, 인증 서버에 값들을 넘겨줍니다. $openid는 OpenID로 사용하는 URL, $process_url은 인증 처리 후 돌아올 URL 그리고 $trust_root는 인증 서버에서 어느 서버에 대해 인증을 허용할 것인지에 대한 값입니다. 예를 들어, $trust_root = "http://secrice.com/"이라고 지정을 하면, 인증 서버에서 "http://secrice.com/" 에서 인증을 요청한다라고 표시가 되는 것이죠.

$openid = $_GET['openid_url'];
$process_url = $_GET['process_url'];
$trust_root = "$_url";

$auth_request = $consumer->begin($openid);
$auth_request->addExtensionArg('sreg', 'optional', 'nickname,email');
$redirect_url = $auth_request->redirectURL($trust_root, $process_url);

header("Location: ".$redirect_url);


3. 서버에서의 인증후 처리

OpenID Server에서 인증을 완료하면 process_url로 정보가 GET 방식으로 리턴되어 들어옵니다. 다음과 같이 complete 함수를 호출하여 원하는 값들을 읽어올 수 있습니다. 인증이 완료된 후에는 페이지 이동후에도 login을 유지하기 위해서 session 관리 등의 기법이 필요할 것입니다.

$response = $consumer->complete($_GET);
if ($response->status == Auth_OpenID_SUCCESS)
{
    $openid = $response->identity_url;
    $sreg = $response->extensionResponse('sreg');
    $nickname = $sreg['nickname'];
    $email = $sreg['email'];

    // 페이지 이동 후에도 Login 유지를 위한 Session 처리
    $user->login_OpenId($openid, $nickname, $email);
}