PHP에서 OpenID 적용시 문제점 정리 및 해결

OpenID 를 적용한 서비스들이 증가하고 있어서, 저도 이번에 사이트를 하나 만들면서 OpenID 를 적용시켜 봤습니다. (아직 서비스는 오픈 안했습니다. OpenAPI를 이용한 나름 재미있는 매쉬업 서비스가 나올꺼 같으니 기대해주세요.. ^^;)

OpenID 로고
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 LibrarySimple 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 : “”));
과 같은 형태로 바꿔주셔야 합니다.

정말 한줄 바꾸는것 뿐인데.. 괜히 글을 거창한게 쓴거 같네요. 근데 전 워낙에 이쪽을 몰라서..
이거 디버깅하면서 찾느라 꽤 많은 시간을 소비했습니다. 혹시 저처럼 고생하실분들 있을까봐 정리해놓습니다 ^^

  1. Warning: CURL emulation does not implement CURL option CURLOPT_FOLLOWLOCATION in
    Warning: CURL emulation does not implement CURL option CURLOPT_HTTPGET in

    이런류의 에러가 쭉 나올때는 어떻게 해야할까요?

  2. libsurlnative.inc.php 에서 328줄

    trigger_error(“CURL emulation does not implement CURL option “._curlopt_name($option),E_USER_WARNING);

    이부분에서 에러가 발생하는데요.
    로그인은 정상적으로 인증되는거 같습니다.
    그냥 무시해도 되나요?

  3. 윗분, 328줄 에러 해결하셨나요? 저도 그러네요 ㅜㅜ 그리고 로그인후에도 역시 328 에러..
    curl문제인듯한데…

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>