[英]Janrain's PHP-OpenID and Google/Yahoo
我正在使用Janrain的PHP-OpenID 2.1.3 ,并且我已经设法让它与我尝试过的所有提供商合作,除了Google和Yahoo。 这里的主要区别似乎是谷歌和雅虎,不像大多数其他提供商,不使用用户特定的URL,而是在他们的最终有所有用户发现框架 - 这将抛出默认的Janrain框架为一个循环,然后它尝试开始auth请求。
从我所看到的情况看起来可能是YADIS发现错误,因为发现是在谷歌或雅虎的结尾,所以应该可以绕过它,但我不确定。 对我来说这对我来说都是非常非正式的学习经历,而且我没有找到能帮助我解决这个问题的文档。 任何提示将非常感谢。
编辑:我遇到的具体问题是,当为Google或Yahoo URL调用begin()函数时,我得到一个null返回。 此功能可在Auth / OpenID / Consumer.php中找到,以供参考。
好的,我终于修复了库...我在这里解释了一切(你也可以在我的修改后下载php-openid库)。
我需要做Paul Tarjan所建议的,但是,我还需要修改Auth_OpenID_detectMathLibrary
并将static
关键字添加到很多函数中。 之后它似乎工作得很好虽然它不是一个理想的解决方案......我认为有人应该用PHP 5重写整个库...
我在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个小时来追踪问题。 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 )。
你在使用示例RP吗? 我是否可以建议您在http://trac.openidenabled.com/trac/newticket?project=php-openid上提交详细的错误或通过邮件列表进行详细查询。
如果正确实现,immediate_mode支持确实可以正常工作。 我(以及其他人)也很乐意在#openid的OpenID IRC频道irc.reenode.net上为您提供帮助。 我的昵称是松弛的。
我同意证书部分 - 对我来说,安装ca-certificates软件包(在类似debian的系统上:apt-get install ca-certificates)和webserver重启解决了google / yahoo问题。 不是我的想法,而是建议在stackoverflow :-)
这是因为你没有在php中启用curl支持。 没有它,它就无法获得https内容。 至少,这就是我发现的。 当我试图获得雅虎或谷歌时,它失败并显示错误消息“身份验证错误;不是有效的OpenID”,但是当我启用php_curl时,它可以正常工作。
确保您的服务器已启用https协议卷曲。 这解决了我。
看到这个帖子 。
这是一个测试它的快速脚本。 在您的服务器上传,然后通过您的浏览器访问它。
<?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永久重定向,这是有道理的。
这个库应该可以与雅虎和谷歌合作。 您可以看到此库的在线演示 ,并使用“yahoo.com”或“ https://www.google.com/accounts/o8/id ”自行试用,以针对这两个OP进行测试。
谷歌有标识符输入,因为他们仍处于测试阶段,并且还没有推动他们的OP标识符只是“google.com”。
我下载了最新的库,使用Yahoo!时得到了相同的失败结果。 我没试过谷歌。
如果我尝试使用http://www.yahoo.com我收到错误说授权失败,但它返回我正确的me.yahoo.com网址。 如果我尝试使用我的me.yahoo.com网址登录,那么我会收到错误提示输入有效的OpenID网址。
另一个潜在的区别是Google和Yahoo使用HTTPS,如果您的PHP或SSL安装配置错误(可能缺少CA证书),那么您的OpenID代码将无法建立关联或完成check_authentication调用。
但是没有错误消息或日志,我无法确定你正在看什么类型的失败。
几年太晚了,但这可能与在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网址的发现仍然失败。 我收到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
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
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的定义。 对于我的快速测试,我添加了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添加设置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.