PHP를 이용하여 10 분만에 OpenID Consumer 구축하기
PHP를 이용하여 10 분만에 OpenID Consumer 구축하기
PHP 에서 OpenID를 이용하기 위한 오픈소스 라이브러리 5가지 중에서 총 JanRain 과 SimpleOpenID 을 사용하는 경우가 많은데
JanRain 라이브러리의 경우 Consumer,Server 의 기능까지 모두 제공하고 있고 SimpleOpenID의 경우 Consumer 기능만을 제공하고 있습니다.
JanRain의 경우 너무 많은 기능을 제공하고 있기 때문에 간단히 SimpleOpenID를 이용해서 Consumer를 구축해보겠습니다.
1.라이브러리 다운로드
SimpleOpenID 사이트에서 다운로드를 받으시거나 여기에서 직접 다운로드 openid_simple-2006-08-07.zip 하시기 바랍니다.
압축을 풀면 다음과 같은 두가지 파일을 볼 수 있습니다.
class.openid.php -- 이 파일 하나만 있으면 OpenID Consumer를 구현할 수 있습니다.
openid-example.php -- 예제파일
2.예제파일 수정
예제를 작동시키기 위해서 openid-example.php에서 모든 $_SERVER["PATH_INFO"] 을
$_SERVER["PHP_SELF"] 로 변경시키면 테스트를 할 수 있다.
Ubuntu 7.04(Feisty Fawn) 나 , www.apmsetup.com 에서 제공하는 APM을 Windows XP에 기본으로 설치하였을 경우
예제를 작동시키면 Error: Class SimpleOpenID requires curl extension to work 라는메세지를 볼 수 있습니다.
에러 메세지가 출력되는 이유는 Simple OpenID 클래스를 작동시키기위해서는 curl extension (Client url library function)이
필요하기 때문입니다.
1) 우분투의 경우 #apt-get install php5-curl 을 실행해서 설치
2) Windows XP의 경우 팩키지를 받으면 기본으로 설치되어 있고 php.ini에
[Extension]
extension=php_curl.dll
을 추가 시켜 주면 됩니다.
만약 웹호스팅해서 CURL을 설치할 수 없다면 php로 curl을 구현해주는 라이브러리를 설치할 수도 있습니다.
설치 방법은 libcurl Emulator 를 참조하시기 바랍니다.
3. 예제파일 실행
http://localhost/openid-example.php 를 실행할 경우 아래와 같은 화면을 볼 수 있고 OpenID 테스트를 해볼실 수 있습니다.
4. Cusomize
- OpenID 서버에 요청할 수 있는 필드
nickname, email, fullname, dob, gender, postcode, country, language, timezone
<?
require('class.openid.php');
// EXAMPLE
if ($_POST['openid_action'] == "login"){ // Get identity from user and redirect browser to OpenID Server
$openid = new SimpleOpenID;
$openid->SetIdentity($_POST['openid_url']);
$openid->SetTrustRoot('http://' . $_SERVER["HTTP_HOST"]);
$openid->SetRequiredFields(array('email','fullname')); // Consumer 가 요구하는 필수 항목들
$openid->SetOptionalFields(array('dob','gender','postcode','country','language','timezone')); // Consumer 가 요구하는 옵션 항목들
if ($openid->GetOpenIDServer()){
$openid->SetApprovedURL('http://' . $_SERVER["HTTP_HOST"] . $_SERVER["PHP_SELF"]); // 모든 처리가 끝나고 OpenID 서버에서 리다이렉트되는 URL
$openid->Redirect(); // This will redirect user to OpenID Server
}else{
$error = $openid->GetError();
echo "ERROR CODE: " . $error['code'] . "<br>";
echo "ERROR DESCRIPTION: " . $error['description'] . "<br>";
}
exit;
}
else if($_GET['openid_mode'] == 'id_res'){ // Perform HTTP Request to OpenID server to validate key
$openid = new SimpleOpenID;
$openid->SetIdentity($_GET['openid_identity']);
$openid_validation_result = $openid->ValidateWithServer();
if ($openid_validation_result == true){ // 인증이 정상적으로 이루어졌을 경우
//이 부분에서 세션 관련 처리를 할 수 있습니다.
echo "VALID";
echo $_GET['openid_identity']; // 사용자의 OpenID
echo $_GET['openid_sreg_nickname:']; // 사용자의 별명
echo $_GET['openid_sreg_email']; // 사용자의 이메일
echo $_GET['openid_sreg_fullname:']; // 사용자의 성명
echo $_GET['openid_sreg_dob']; // 사용자의 생일
echo $_GET['openid_sreg_gender']; // 사용자의 성별
echo $_GET['openid_sreg_postcode']; // 사용자의 우편번호
echo $_GET['openid_sreg_country']; // 사용자의 거주지역
echo $_GET['openid_sreg_language']; // 사용자가 선호하는 언어
echo $_GET['openid_sreg_timezone']; // 사용자 timezone For example, "Europe/Paris" or "America/Los_Angeles".
}else if($openid->IsError() == true){ // 인증하는 도중 에러가 발생하였을 경우 처리
$error = $openid->GetError();
echo "ERROR CODE: " . $error['code'] . "<br>";
echo "ERROR DESCRIPTION: " . $error['description'] . "<br>";
}else{ // Signature Verification Failed
echo "INVALID AUTHORIZATION";
}
}else if ($_GET['openid_mode'] == 'cancel'){ // User Canceled your Request
echo "USER CANCELED REQUEST";
}
?>
5. Reference
php-curl 관련 정보 : http://kr2.php.net/curl/
curl 다운로드 사이트 : http://curl.haxx.se/download.html
이 게시물을 공유 주셔서 감사합니다. 이것은 매우 유용하고 유익한 물질입니다. 너무 많이 사용하는 JanRain 때문에 덜 SimpleOpenID Consumer'll 구축했다.
1. 다운로드 도서관SimpleOpenID 어디 사이트에서 직접 다운로드 sigeona openid_simple - 2006 - 08 - 07.zip 얻을 다운로드하시기 바랍니다.다음 두 파일을 풀고 후 볼 수있습니다.class.openid.php -이 파일은 실행할 수있는 경우에만 오픈 ID 소비자.오픈 ID - example.php - 샘플 좋은 기사 파일과 그것을 유지. 웹사이트는 항상 하나의 방법이나 다른 현실의 세계로 당신의 꿈을 쳐도 시작하는 멋진 물건들, 어쨌든, mcsa certification 좋은 방법이 도움이됩니다.감사합니다마이클,
echo $_GET['openid_identity']; // 사용자의 OpenID
echo $_GET['openid_sreg_nickname:']; // 사용자의 별명
echo $_GET['openid_sreg_email']; // 사용자의 이메일
echo $_GET['openid_sreg_fullname:']; // 사용자의 성명
echo $_GET['openid_sreg_dob']; // 사용자의 생일
echo $_GET['openid_sreg_gender']; // 사용자의 성별
echo $_GET['openid_sreg_postcode']; // 사용자의 우편번호
echo $_GET['openid_sreg_country']; // 사용자의 거주지역
echo $_GET['openid_sreg_language']; // 사용자가 선호하는 언어
echo $_GET['openid_sreg_timezone'];
위의 예제에는 openid.sreg.nickname 이런식으로 .(닷) 으로 연결되어있는데
지금 제가 확인해보니 _(언더라인) 이네요.
현재 개발 버전에 적용 되었습니다.
다음 주 중에 myid.net에 적용될 것 같습니다.^^
예제소스의 경우 거의 모든 필드를 요청하는데 옵션필드에 어떤 것 하나라도 채우지 않으면 INVALID AUTHORIZATION 메세지를 보실 수 있습니다. 예를들면 postcode 가 옵션 필드임에도 불구하고 내용을 채우지 않으면 INVALID AUTHORIZATION 를 볼 수 있습니다.
버그인것 같은데 myid.net일때 메세지를 볼 수 있고, idtail.com은 정상적으로 작동합니다.
"INVALID AUTHORIZATION"
이 에러 메세지가 나옵니다.
이 에러메세지는 어떠한 경우에 나오는건가요?
분명 승인버튼누르는 페이지까지는 잘 가는데
인증이 끝난후 내 홈페이지로 리다이렉트되면서 저런 에러메세지가 나오는데
error description이 없어서 어떻게 해결해야하는지 좀 당혹스럽네요. 도와주세요.
php에는 curl이 설치되었습니다.

