2011-11-18 5 views
6

최신 LightOpenID 릴리스의 OpenID 로그인 시스템을 구현하고 싶습니다. 소스 코드를 한 줄씩 제공하는 예제를 테스트 중입니다. 생성자에서 localhost$_SERVER['HTTP_HOST']으로 바꿨습니다.라이브 서버에서 OpenID 로그인 코드가 실패합니다.

문제는 개인 네트워크 (Windows Vista의 경우 PHP/5.3.6)의 개발 상자에서 모든 것이 잘 작동하지만 HSP 공용 네트워크 (PHP/5.3.3 CentOS의 경우)에서 유효성 검사가 항상 실패한다는 것입니다.).

나는 var_dump()을 모두 추가했으며 코드 사본 두 개 모두 정확히 동일한 요청 매개 변수를 생성하고 GET을 통해 정확히 동일한 응답 매개 변수를 수신한다고 말할 수 있습니다. openid.assoc_handle, openid.sig, openid.response_nonceopenid.return_to은 다른 값을 가지며 예상되는 동작입니다.

그러나, 내 dev에 상자가 (내가 사용하는 일없이) 오픈 ID 공급자로부터이 수신 :

is_valid:true 
ns:http://specs.openid.net/auth/2.0 

... 내 라이브 여우는이 수신 :

is_valid:false 
ns:http://specs.openid.net/auth/2.0 

이 때로 믿을 수 ASCII 문자가 아닌 문자가 포함되어있어 인코딩 문제가 될 수 없습니다. 호스팅 서비스에 문제가있을 수 있지만 무엇을 알아 내지 못합니다.

가능한 원인 및 문제 해결 팁에 대한 제안이 필요합니다.

답변

11

나는이 문제를 격리하고 해결 방법을 발견했다. request() 방법은 HTTP 연결을 stablish하는 방법을 찾기 위해 몇 가지 자동 감지한다 : 내 dev에 상자에서

protected function request($url, $method='GET', $params=array(), $update_claimed_id=false) 
{ 
    if (function_exists('curl_init') 
     && (!in_array('https', stream_get_wrappers()) || !ini_get('safe_mode') && !ini_get('open_basedir')) 
    ) { 
     return $this->request_curl($url, $method, $params, $update_claimed_id); 
    } 
    return $this->request_streams($url, $method, $params, $update_claimed_id); 
} 

는 CURL을 사용하지만 검사가 실패하기 때문에 내 라이브 상자에이 file_get_contents()을 사용합니다. 그 이유는 open_basedir 지시어가 비어 있지 않기 때문입니다.

CURL을 사용하도록 LightOpenID를 강제 설정하면 모든 것이 원활하게 실행됩니다.


업데이트 # 1 : 그 컬을 결정할 때 LightOpenID이 옳았다는 사용할 수 없습니다이었다.

가 safe_mode가이 활성화하거나의 open_basedir이 file_get_contents() 버전으로

을 설정 한 경우 CURLOPT_FOLLOWLOCATION를 활성화 할 수 없습니다

, 나는이에 오타를 발견했습니다 의심 : 나는 로그 파일이 발견 라이브러리 :

Index: lightopenid/openid.php 
=================================================================== 
--- lightopenid/openid.php (0.60) 
+++ lightopenid/openid.php (working copy) 
@@ -349,7 +349,7 @@ 
      $this->headers = $this->parse_header_array($http_response_header, $update_claimed_id); 
     } 

-  return file_get_contents($url, false, $context); 
+  return $data; 
    } 

    protected function request($url, $method='GET', $params=array(), $update_claimed_id=false) 

나는 저자에게 알리고 버그임을 확인했다. 나는 그것이 고쳐지면 다시보고 할 것이다.

업데이트 # 2 : 그것은 여전히 ​​안정적인 릴리스의 일부가 아닙니다하지만 code repository에서 다운로드 할 수 있습니다 2012 년 6 월에 마스터 브랜치에서 버그 was fixed.

+0

수정 해 주셔서 감사합니다. 중복되었지만 $ data와 같은 file_get_contents ($ url, false, $ context)에 대한 두 번째 호출이 작동하지 않는 이유가 궁금합니다. – neobie

+2

보안상의 이유로 한 번의 호출 만 성공적으로 확인할 수 있다고 가정합니다. –

+0

이유는 '넌스'라고합니다. 일회성 전용 토큰입니다. – Maerlyn

0

그냥 어둠 속에 있었지만 OpenID (lightopenid가 아닌)로 작업했지만 CodeIgniter 용 라이브러리로 작업했을 때 권한이 nonce 캐시 폴더에 올바르게 설정되지 않은 경우 비슷한 문제가 발생했습니다. 어쩌면 저장소에 대한 간단한 사용 권한 문제일까요?

+0

내가 아는 한, LightOpenID는 저장소를 사용하지 않습니다. 하지만 차이점을 발견했습니다 : 라이브 서버는 CURL을 사용할 수없는 것 같고 LightOpenID는 대신'file_get_contents()'를 사용합니다. 나는 그것이 관련성이 있는지 알아 내려고 노력할 것입니다. –

관련 문제