OpenID 를 적용한 서비스들이 증가하고 있어서, 저도 이번에 사이트를 하나 만들면서 OpenID 를 적용시켜 봤습니다. (아직 서비스는 오픈 안했습니다. OpenAPI를 이용한 나름 재미있는 매쉬업 서비스가 나올꺼 같으니 기대해주세요.. ^^;)
OpenID 가 뭔지 한글로 알고싶으시다면 OpenID.co.kr 을 참조하세요.
일단 OpenID 를 적용한다면 두가지 사용용도가 있습니다. Server 를 작성하느냐, Consumer 를 작성하느냐
Server 는 OpenID 인증을 제공해주는 Identity Provider 들입니다. 국내에도 myID.net , IDtail.com등의 서비스가 있습니다.
Consumer 는 OpenID 를 사용자를 ID 로 인정하여 사용할수 있게해주는 것인데, 스프링노트,미투데이등의 서비스를 보시면 됩니다.
일반적인 서비스라면, Consumer 가 되어 OpenID 로 사용자를 인증하면 됩니다. OpenID 를 자신의 페이지에 구현할때 사용할수 있는 라이브러리들은 OpenID Libraries에 정리 되어있습니다. C#,C++,Java,Perl,Python,Ruby,PHP 등 현재 웹개발시 쓰이는 많은 언어용 라이브러리가 제공되고 있습니다.
이중에 국내에서 가장 많이 쓰일 라이브러리는 아마도 PHP 가 아닐까 싶습니다. 근래에는 Ruby,Python 이 많이 쓰이는것 같지만 PHP 사용자가 이미 많으니까요. PHP 의 경우는 총 5개 라이브러리가 나와있습니다만, 사용하기에는 JanRain PHP OpenID Library 와 Simple OpenID PHP Class가 편한것 같습니다.
JanRain 의 경우는 Server,Consumer 를 다 지원하구요. Simple OpenID Class 는 Consumer 만을 지원합니다.
그럼 그냥 사용하면 되겠군 하고 적용을 해보는데 문제가 발생했습니다.
Simple OpenID Class 는 PHP에 CURL 을 필요로 합니다. 이 CURL 이 보안문제때문에 호스팅하는 업체측에서 안하는곳이 꽤 있더군요. 제가 사용하는 업체가 그중에 하나입니다. ㅠㅠ (가격도 저렴하고 좋은데 아쉽습니다.)
JanRain 은 CURL 을 사용할수 있지만, 없어도 된다고 써있어서 적용해 봤는데.. 하다가 에러가 계속 발생해서 보니 PHP에 DOMXML 을 필요로 하더군요. 중간에 에러를 내면서 작동이 되질 않습니다. 역시 제가 사용하는 업체에는 이게 적용이 안되더군요. ㅡ.ㅡ;
그럼 일단 둘중의 하나를 어떻게는 수정해서 써야하는데, JanRain 같은경우는 소스코드가 복잡해서 제가 수정하긴 무리구요. 파일 하나로 달랑 구성된 Simple OpenID Class를 수정해서라도 사용해 보기로 했습니다.
일단 CURL 이 지원되어야 하는데 이게 없으므로 대용할것이 없나 찾아보니, 마침 쓸만한게 있더군요.
libcurl Emulator 라는게 있네요.
순수하게 PHP 소스 만으로 CURL 확장을 지원하는 겁니다. curl_* 로 시작하는 모든 함수들을 에뮬레이트 해줍니다.
즉, CURL 지원이 안되는 호스팅 계정에서도 CURL 관련 함수들을 사용할 수 있다는것이죠.
사용하는 예제는 다음과 같습니다.
<?php // libcurlemu.inc.php 인클루드하기 require_once('libcurlemu.inc.php'); // 이후부터는 CURL 이 있던없던 그냥 curl_* 함수들을 호출하면 됩니다. // CURL 초기화 $ch = curl_init(); // URL 과 옵션 지정하기 curl_setopt($ch, CURLOPT_URL, "http://www.example.com/"); curl_setopt($ch, CURLOPT_HEADER, false); // URL에서 읽어오기 curl_exec($ch); // CURL 닫기 curl_close($ch); ?>
보기에는 무척 간단하죠. 그냥 인클루드해주고 사용하면 되니까요 ^^
근데 실제 사용해보니 curl을 완벽히 에뮬레이팅 해주는 것은 아닙니다. 옵션지정같은것이 안되기 때문에.. 사용하는 class.openid.php 파일을 조금 바꿔줘야 합니다.
class.openid.php 내용중에서 ..
curl_init 사용시 인자로 URL 전달이 불가능합니다. 즉 curl_init(URL) 이 안되므로 아래와 같이 바꿉니다.
CURL_Request 함수의 의 $curl = curl_init($url . ($method == “GET” && $params != “” ? “?” . $params : “”)); 을
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL,$url . ($method == “GET” && $params != “” ? “?” . $params : “”));
과 같은 형태로 바꿔주셔야 합니다.
정말 한줄 바꾸는것 뿐인데.. 괜히 글을 거창한게 쓴거 같네요. 근데 전 워낙에 이쪽을 몰라서..
이거 디버깅하면서 찾느라 꽤 많은 시간을 소비했습니다. 혹시 저처럼 고생하실분들 있을까봐 정리해놓습니다 ^^
Warning: CURL emulation does not implement CURL option CURLOPT_FOLLOWLOCATION in
Warning: CURL emulation does not implement CURL option CURLOPT_HTTPGET in
이런류의 에러가 쭉 나올때는 어떻게 해야할까요?
CURL에뮬에 그런 옵션이 빠져있는거 같은데.. 그쪽은 무시해도 상관없지 않을까요 ?
libsurlnative.inc.php 에서 328줄
trigger_error(“CURL emulation does not implement CURL option “._curlopt_name($option),E_USER_WARNING);
이부분에서 에러가 발생하는데요.
로그인은 정상적으로 인증되는거 같습니다.
그냥 무시해도 되나요?
로그인만 정상적으로 된다면 별 문제 없지 않을까요? ^^;
윗분, 328줄 에러 해결하셨나요? 저도 그러네요 ㅜㅜ 그리고 로그인후에도 역시 328 에러..
curl문제인듯한데…