如何使用Zend OpenID实现基于直接身份的OpenID身份验证

Ali*_*Ali 16 php openid authentication zend-framework login

我正在使用来自http://code.google.com/p/openid-selector/的Zend框架和openid选择器- 但我发现我无法使用Google和Yahoo这样的网站登录,因为他们使用基于身份的直接登录系统,其中一个只是重定向到一个网址,而不是输入自己的唯一网址进行身份验证.

我检查了很多选项和黑客,但似乎没有一个工作.我怎么能在这里使用它btw - 它是如何在堆栈溢出时实现的?我真的可以在这里使用所有的帮助..


编辑

那么问题是,我注意到Zend OpenID类不支持OpenID 2.0,因为典型的开放ID提供程序会为您提供一个唯一的URL,例如your-name.openid-providor.com或openid -providor.com/your-name和Zend OpenId类只需解析该URL,然后将您重定向到providor网站,在此网站上进行身份验证后,您将被重定向回来.

在雅虎和谷歌的情况下 - 你没有输入一个独特的网址,而是你被重定向到提供者登录网站,登录和身份验证后你被重定向回来 - 所以基本上发生的是zend_openID对象,当它解析时告诉谁提供者是不是从一般网址本身告诉.就像点击Google链接一样,它会将您重定向到https://www.google.com/accounts/o8/id

它更多是zend openid对象的问题,并且在zend相关论坛上没有任何帮助 - 所以我想知道是否有人已经入侵或者我可以对课程做出改变以实现这一点.对不起,如果我错过了一些东西,但我对此有点新鲜,并使用开放ID进行编程,并且刚刚开始弄湿我的脚.


感谢您的跟进 - 我确实检查了RPX一段时间后他们确实有一个PHP类,但我无法检查它加上我真的只是想现在得到使用在stackoverflow上的代码选择器与雅虎和Google身份验证.必须有某种方式来调整Zend OpenID类使用的解析,因为它运行一系列正则表达式检查来进行发现.

Ste*_*iec 9

比赛的时间已经很晚了,但是我能够通过我在互联网周围发现的一些黑客来解决这个问题.

第一.雅虎.为了让雅虎工作,我所要做的就是改变JavaScript以使用me.yahoo.com而不仅仅是yahoo.com,它与我正在使用的Zend Framework版本完美配合.不幸的是谷歌仍然没有,所以一些黑客行为是有序的.

所有这些变化都在进行中 Zend/OpenId/Consumer.php

首先,在该_discovery方法中,在从第740行开始的一系列preg_match检查中添加以下内容.

} else if (preg_match('/<URI>([^<]+)<\/URI>/i', $response, $r)) {
    $version = 2.0;
    $server = $r[1];
Run Code Online (Sandbox Code Playgroud)

return false;在else {}块中的语句之前添加了这个权限.

其次,在这个_checkId方法中你需要添加3个新块(我没有挖到足够的东西来知道是什么导致这三个案例中的每一个被调用,所以我将所有内容都放在安全的一边.

在$ version <= 2.0块中,你会找到一个if/else if/else块.在第一个if语句中($this->_session !== null)将此添加到结尾:

if ($server == 'https://www.google.com/accounts/o8/ud') {
    $this->_session->identity = 'http://specs.openid.net/auth/2.0/identifier_select';
    $this->_session->claimed_id = 'http://specs.openid.net/auth/2.0/identifier_select';
}
Run Code Online (Sandbox Code Playgroud)

在else if(已定义('SID')块中将此添加到结尾:

if ($server == 'https://www.google.com/accounts/o8/ud') {
    $_SESSION['zend_openid']['identity'] = 'http://specs.openid.net/auth/2.0/identifier_select';
    $_SESSION['zend_openid']['claimed_id'] = 'http://specs.openid.net/auth/2.0/identifier_select';
}
Run Code Online (Sandbox Code Playgroud)

然后在else块之后(所以在if/else if/else块之外都在一起,但仍然在$ version <= 2.0块内)添加:

if ($server == 'https://www.google.com/accounts/o8/ud') {
    $params['openid.identity'] = 'http://specs.openid.net/auth/2.0/identifier_select';
    $params['openid.claimed_id'] = 'http://specs.openid.net/auth/2.0/identifier_select';
}
Run Code Online (Sandbox Code Playgroud)

链接到Zend Framework Issue Tracker中的错误