我想用最新的
LightOpenID版本实现一个OpenID登录系统.我正在逐行测试源代码提供的示例(我只是在构造函数中用$_SERVER [‘HTTP_HOST’]替换了localhost).
问题是在我的私人网络(Windows Vista上的PHP / 5.3.6)的开发框中一切正常,但在HSP公共网络(CentOS上的PHP / 5.3.3)的生命服务器中验证总是失败.
我已经添加了var_dump(),我可以告诉你,代码的两个副本产生完全相同的请求参数并接收完全相同的响应参数(通过GET).只有openid.assoc_handle,openid.sig,openid.response_nonce和openid.return_to有不同的值,我猜这是预期的行为.
但是,我的开发框从OpenID提供程序收到此信息(无论我使用哪一个):
is_valid:true ns:http://specs.openid.net/auth/2.0
……我的活狐得到了这个:
is_valid:false ns:http://specs.openid.net/auth/2.0
没有涉及任何非ASCII字符,因此它不能成为编码问题.我的托管服务肯定有问题,但我无法弄清楚是什么.
我需要有关可能原因和故障排除提示的建议.
我已经解决了问题并找到了解决方法. request()方法进行一些自动检测以找出如何建立HTTP连接:
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,$update_claimed_id); }
在我的开发框中使用CURL但在我的实时框中它使用file_get_contents(),因为检查失败.原因是open_basedir指令不为空.
如果我强制LightOpenID使用CURL,一切都运行顺利.
更新#1:LightOpenID在确定卷曲不可用时是正确的.我在日志文件中找到了这个:
CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled
or an open_basedir is set
至于file_get_contents()版本,我怀疑我在库中发现了一个拼写错误:
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,$update_claimed_id=false)
我已经通知了作者,他确认这是一个错误.我会报告它是否得到修复.
更新#2:2012年6月在master分支中的错误was fixed.它仍然不是稳定版本的一部分,但可以从code repository下载.