PHP 오픈아이디 구현 방법 (OpenID Consumer)
3557 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 입니다. 간단한 폼의 샘플은 다음과 같습니다.
2. 인증 서버로 redirect 하는 try_auth.php
위의 폼을 전송하면 try_auth.php에서 값들을 받아 처리를 한 뒤, 인증 서버에 값들을 넘겨줍니다. $openid는 OpenID로 사용하는 URL, $process_url은 인증 처리 후 돌아올 URL 그리고 $trust_root는 인증 서버에서 어느 서버에 대해 인증을 허용할 것인지에 대한 값입니다. 예를 들어, $trust_root = "http://secrice.com/"이라고 지정을 하면, 인증 서버에서 "http://secrice.com/" 에서 인증을 요청한다라고 표시가 되는 것이죠.
3. 서버에서의 인증후 처리
OpenID Server에서 인증을 완료하면 process_url로 정보가 GET 방식으로 리턴되어 들어옵니다. 다음과 같이 complete 함수를 호출하여 원하는 값들을 읽어올 수 있습니다. 인증이 완료된 후에는 페이지 이동후에도 login을 유지하기 위해서 session 관리 등의 기법이 필요할 것입니다.
우리가 관심있어 하는 부분은 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>
<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);
$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);
}
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);
}


Trackback (0)
Comment (9)