Janrain的PHP-OpenID和谷歌/雅虎

时间:2009-06-14 11:47:39

标签: php openid yahoo janrain

我正在使用Janrain's PHP-OpenID 2.1.3,我已经设法让它与我尝试过的所有提供商合作,除了谷歌和雅虎。这里的主要区别似乎是谷歌和雅虎,不像大多数其他提供商,不使用用户特定的URL,而是在他们的最终有所有用户发现框架 - 这将抛出默认的Janrain框架为一个循环,然后它尝试开始auth请求。

从我所看到的情况看起来可能是YADIS发现错误,因为发现是在谷歌或雅虎的结尾,所以应该可以绕过它,但我不确定。对我来说这对我来说都是非常非正式的学习经历,而且我没有找到能帮助我解决这个问题的文档。任何提示将不胜感激。

编辑:我遇到的具体问题是,当为Google或Yahoo网址调用begin()函数时,我得到一个null返回值。此功能可在Auth / OpenID / Consumer.php中找到,以供参考。

11 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:6)

我在Windows XP上遇到了同样的问题。通过激活卷曲扩展来修复。要做到这一点,请在php.ini中取消注释行

extension=php_curl.dll

删除前面的; (如果有的话)。重启apache。

同样在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进行通信。对于谷歌和雅虎,你需要https,所以它只有在启用open_ssl时才有效(Auth_Yadis_PlainHTTPFetcher :: supportsSSL必须返回true)。

答案 2 :(得分:2)

我遇到了完全相同的问题,我花了近2个小时来跟踪问题。 Jan Rain的OpenId lib需要'DOM或domxml PHP XML'(https://github.com/openid/php-openid),但如果两者都不可用,它将无声地失败!

在我的CentOS安装上简单:

yum install php-xml

解决了问题(我正在使用此回购:http://blog.famillecollet.com/pages/Config-en)。

答案 3 :(得分:1)

这个库应该可以与Yahoo和Google一起使用。您可以看到此库的online demo,并使用“yahoo.com”或“https://www.google.com/accounts/o8/id”自行试用,以针对这两个OP进行测试。

谷歌已经输入了标识符,因为它们仍然处于测试版状态,并且尚未将其OP标识符推送到“google.com”。

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

我同意证书部分 - 我安装了ca-certificates软件包(在类似debian的系统上:apt-get install ca-certificates),网络服务器重启解决了google / yahoo问题。不是我的想法,而是建议on stackoverflow: - )

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

请参阅此thread

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

<?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永久重定向,这是有道理的。

答案 8 :(得分:0)

我下载了最新的库,使用Yahoo!时得到了相同的失败结果。我没试过谷歌。

如果我尝试使用http://www.yahoo.com,我会收到错误消息,说明授权失败,但它会返回正确的me.yahoo.com网址。如果我尝试使用我的me.yahoo.com网址登录,那么我会收到一条错误,说输入有效的OpenID网址。

答案 9 :(得分:0)

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

但是如果没有错误消息或日志,我无法确定你正在看什么类型的失败。

答案 10 :(得分:0)

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

我的简单测试,只是为了确保图书馆与Google联系,就是使用examples / discover.php程序,并传递Googles OpenID网址(https://www.google.com/accounts/o8/id)。

根据说明,标准步骤是启用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网址的发现仍然失败。我在php错误日志中得到CURL error (60): SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

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

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

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