6

我想用最新的LightOpenID版本实现一个 OpenID 登录系统。我正在逐行测试源代码提供的示例(我只是在构造函数中替换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_nonceopenid.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 字符,因此它不会是编码问题。我的托管服务一定有问题,但我就是不知道是什么问题。

我需要有关可能原因和故障排除技巧的建议。

4

2 回答 2

11

我已经隔离了问题并找到了解决方法。该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,但在我的 live 框中使用它file_get_contents()是因为检查失败。原因是open_basedir指令不为空。

如果我强制 LightOpenID 使用 CURL,一切都会顺利进行。


更新 #1: LightOpenID 在决定 curl 不可用时是正确的。我在日志文件中找到了这个:

启用安全模式或设置 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 分支中修复。它仍然不是稳定版本的一部分,但可以从代码存储库下载。

于 2011-11-18T20:04:55.533 回答
0

只是在黑暗中拍摄,但是当我使用 OpenID(不是 lightopenid)而是使用 CodeIgniter 的库时,当我的权限没有为 nonce 缓存文件夹正确设置时,我遇到了类似的问题。也许这是一个简单的存储权限问题?

于 2011-11-18T19:14:57.413 回答