10

我正在使用Janrain 的 PHP-OpenID 2.1.3,并且我已经设法让它与我尝试过的所有提供商一起工作,除了 Google 和 Yahoo。这里的主要区别似乎是谷歌和雅虎,与大多数其他提供商不同,不使用用户特定的 URL,而是将用户发现框架全部放在他们的末端——这会抛出默认的 Janrain 框架进行循环然后它尝试开始身份验证请求。

从我所看到的看来,可能是 YADIS 发现引发了错误,应该可以绕过该发现,因为该发现位于 Google 或 Yahoo 端,但我不确定。这对我来说都是一次重要的非正式学习经历,而且我没有任何运气找到可以帮助我解决这个问题的文档。任何提示将非常感谢。

编辑:我遇到的具体问题是,当为 Google 或 Yahoo URL 调用 begin() 函数时,我得到一个空返回。该函数位于 Auth/OpenID/Consumer.php 中以供参考。

4

8 回答 8

10

好的,我终于要修复库了...我在这里解释了所有内容(您也可以在我更改后下载 php-openid 库)。

我需要按照 Paul Tarjan 的建议去做,但是,我还需要修改关键字Auth_OpenID_detectMathLibrary并将static关键字添加到很多函数中。之后它似乎工作完美,虽然它不是一个理想的解决方案......我认为有人应该用 PHP 5 重写整个库......

于 2009-10-05T17:13:10.547 回答
6

我在 Windows XP 上遇到了同样的问题。通过激活 curl 扩展来修复。为此,请在 php.ini 中取消注释该行

extension=php_curl.dll

通过删除; 如果有的话,在它前面。重启阿帕奇。

此外,在 Windows 上要正常工作,您需要将 Auth_OpenID_RAND_SOURCE 定义为 null,因为在 Windows 中您没有随机源。您可以通过添加行来做到这一点

define('Auth_OpenID_RAND_SOURCE', null);

在第一个代码行之前的 CryptUtil.php

if(!defined('Auth_OpenID_RAND_SOURCE')){

即使没有启用 curl,API 也应该通过使用 Auth_Yadis_PlainHTTPFetcher 通过 HTTP 进行通信来工作。对于 Google 和 Yahoo,您需要 https,因此它仅在启用 open_ssl 时才有效(Auth_Yadis_PlainHTTPFetcher::supportsSSL 必须返回 true)。

于 2010-04-07T20:04:57.567 回答
2

我遇到了完全相同的问题,我花了将近 2 个小时来跟踪问题。Jan Rain 的 OpenId 库需要“DOM 或 domxml PHP XML”(https://github.com/openid/php-openid),但当两者都不可用时它会静默失败!

在我的 CentOS 安装上很简单:

yum install php-xml

解决了这个问题(我正在使用这个仓库:http: //blog.famillecollet.com/pages/Config-en)。

于 2011-01-06T21:55:42.547 回答
1

您是否使用示例 RP?我可以建议您在http://trac.openidenabled.com/trac/newticket?project=php-openid提交详细的错误或通过邮件列表进行详细查询。

如果正确实施,immediate_mode 支持确实可以使用库。我(和其他人)也很乐意在#openid 的 OpenID IRC 频道 irc.reenode.net 上为您提供帮助。我的昵称是松弛的。

于 2009-06-23T11:31:25.513 回答
1

这是因为您没有在 php.ini 中启用 curl 支持。没有这个,它就无法获取 https 内容。至少,这是我发现的。当我尝试获取 yahoo 或 google 时,它​​失败并显示错误消息“身份验证错误;不是有效的 OpenID”,但是当我启用 php_curl 时,它可以正常工作。

于 2009-06-30T22:05:24.913 回答
1

确保您的服务器启用了 https 协议的 curl。这为我解决了。

看到这个线程

这是一个快速脚本来测试它。在您的服务器上上传,然后通过您的浏览器访问它。

<?php
error_reporting(E_ALL);
// create curl resource
$myurl = 'https://<YOURACCOUNT>.myopenid.com';
$curl_handle=curl_init();
curl_setopt($curl_handle,CURLOPT_URL, $myurl);
curl_setopt($curl_handle,CURLOPT_CONNECTTIMEOUT,2);
curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER,1);
$buffer = curl_exec($curl_handle);


if (empty($buffer))
{
    print "Sorry, cannot access $myurl .<p>". curl_error($curl_handle);
}
else
{
    print $buffer;
}

curl_close($curl_handle);


?>

如果它返回“libcurl 中不支持或禁用协议 https”,那么你就知道该怎么做了。

我使用我的 gmail 帐户进行了尝试,它可以工作,但它会导致 301 永久重定向,这是有道理的。

于 2009-09-28T14:35:29.060 回答
0

另一个潜在的区别是 Google 和 Yahoo 使用 HTTPS,如果您的 PHP 或 SSL 安装配置错误(可能缺少 CA 证书),那么您的 OpenID 代码将无法建立关联或完成 check_authentication 调用。

但是如果没有错误消息或日志,我真的无法判断您正在查看哪种类型的故障。

于 2009-06-22T00:01:39.280 回答
0

几年太晚了,但这可能与在 Windows 平台上使用Janrains PHP OpenID 2.2.2库的用户有关。我仍在使用 PHP 5.2.17。

我的简单测试是使用examples/discover.php 程序并传递Google 的OpenID URL ( https://www.google.com/accounts/o8/id ) ,以确保该库与Google 联系。

根据说明,标准步骤是启用 GMP(取消注释扩展名=php_gmp.dll)和 CURL(取消注释扩展名=php_curl.dll)。XML 应该已经启用。

您可能还需要在 contrib/google 中提取包并确保 google_discovery.php 和 ca-bundle.crt 在 Auth/OpenID 中。

额外的偏执狂可以从examples/detect.php 开始,以确保它们的设置正确。预计您将通过除密码随机性测试之外的所有测试。为此,您需要添加

define('Auth_OpenID_RAND_SOURCE', null);

到examples/detect.php的顶部。当您在那里时,将其添加到examples/consumer/common.php(因为examples/discover.php 使用它)。

现在,即使在这一切之后,Google OpenID URL 的发现也失败了。我正在进入CURL error (60): SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failedphp 错误日志。

在 Windows 环境中,您需要 CURLOPT_CAINFO 的定义。为了我的快速测试,我curl_setopt($c, CURLOPT_CAINFO, dirname(__FILE__)."/../OpenID/ca-bundle.crt");在 Auth/Yadis/ParanoidHTTPFetcher.php 中的 curl_exec() 语句之前添加。

这允许examples/discover.php 发现Google URL 提供的服务。

作为在 Windows 中设置 CURLOPT_CAINFO 的长期解决方案,您可能希望参考此 StackOverflow 答案,以便您可以将设置添加到 php.ini。

于 2011-08-12T00:46:25.967 回答