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

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

PHP에서 OpenID 적용시 문제점 정리 및 해결”에 대한 5개의 생각

  1. k

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

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

    응답
  2. k

    libsurlnative.inc.php 에서 328줄

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

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

    응답
  3. 지엠

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

    응답

구루에게 댓글 남기기 댓글 취소

이메일은 공개되지 않습니다.