繁体   English   中英

Janrain的PHP-OpenID和谷歌/雅虎

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM