我想用最新的LightOpenID版本实现一个OpenID登录系统.我测试设置有由线的源代码行的例子(I刚刚更换localhost
与$_SERVER['HTTP_HOST']
在构造).
问题是在我的私人网络(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, $method, $params, $update_claimed_id); }
在我的开发框中使用CURL但在我的实时框中它使用,file_get_contents()
因为检查失败.原因是open_basedir
指令不是空的.
如果我强制LightOpenID使用CURL,一切都运行顺利.
更新#1: LightOpenID在确定卷曲不可用时是正确的.我在日志文件中找到了这个:
启用safe_mode或设置open_basedir时,无法激活CURLOPT_FOLLOWLOCATION
至于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, $method='GET', $params=array(), $update_claimed_id=false)
我已经通知了作者,他确认这是一个错误.我会报告它是否得到修复.
更新#2:该错误已于 2012年6月在master分支中修复.它仍然不是稳定版本的一部分,但可以从代码库下载.