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

标签 php zend-framework authentication openid

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

我检查了很多选项和技巧,但似乎都不起作用。我怎样才能让它在这里工作顺便说一句 - 它是如何在堆栈溢出时实现的?伙计们,我真的可以使用这里的所有帮助..


编辑

这里的问题是,据我所知,Zend OpenID 类不支持 OpenID 2.0,典型的开放 ID 提供者会为您提供唯一的 url,例如 your-name.openid-providor。 com 或 openid-providor.com/your-name 和 Zend OpenId 类只是通过该 url 进行解析,然后将您重定向到提供商网站,在身份验证后您将被重定向回来。

在 Yahoo 和 google 的情况下 - 你不输入一个唯一的 url 而是你被重定向到提供商登录站点,并且在登录和身份验证后你被重定向回来 - 所以基本上发生的事情是 zend_openID 对象在解析时从通用 URL 本身无法判断提供者是谁。就像当您点击 Google 链接时,它会将您重定向到 https://www.google.com/accounts/o8/id

这里更多的是 zend openid 对象的问题,并且在 zend 相关论坛上没有任何帮助 - 所以我想知道是否有人已经破解或对类进行了更改以实现此目的。抱歉,如果我遗漏了什么,但我对这个和使用开放 ID 编程还比较陌生,而且才刚刚开始涉足。


感谢您的跟进 - 前阵子我确实检查过 RPX,他们确实有一个 php 类,但我无法检查它,而且我现在真的只想让 stackoverflow 上使用的代码选择器正常工作与雅虎和谷歌身份验证。必须有某种方法来调整 Zend OpenID 类在运行一系列正则表达式检查以进行发现时使用的解析。

最佳答案

游戏有点晚了,但我能够通过我在互联网上发现的一些 hack 来实现它。

首先。雅虎。为了让 Yahoo 工作,我所要做的就是将 JavaScript 更改为使用 me.yahoo.com 而不是仅仅使用 yahoo.com 并且它与 Zend 版本完美配合我正在使用的框架。不幸的是,谷歌仍然没有,所以一些黑客是有序的。

所有这些更改都在 Zend/OpenId/Consumer.php

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

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

我在 else {} block 中的 return false; 语句之前添加了这个。

其次,在 _checkId 方法中,您需要添加 3 个新 block (我还没有深入了解导致调用这三种情况的原因,所以我涵盖了所有为了安全起见。

在 $version <= 2.0 block 中,您会找到一个 if/else if/else block 。在第一个 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';
}

在 else if (defined('SID') block 中将此添加到末尾:

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';
}

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

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';
}

Link to the bug in Zend Framework Issue Tracker

关于php - 如何使用 Zend OpenID 实现基于直接身份的 OpenID 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/741345/

相关文章:

php - 无法获取记录以使用 PHP 插入到 mysql 数据中

authentication - 如何使用 PAM 对用户进行身份验证?

android - 权限拒绝 : opening provider com. android.providers.contacts.ContactsProvider2

php - 数据表警告 : table id=DataTables_Table_0 - Ajax error

php- 使用 INSERT 调用非对象上的成员函数 bind_param()

php - mysql in 子句使用过程而不是子查询

php - Zend 搜索序列号(字符串而不是整数)

zend-framework - Zend 框架 get Request()->get Query() 不会在本地主机上带来查询字符串

jquery - 尝试使用 jQuery 为 Zend Framework 找到 AJAX 文件上传解决方案

authentication - 手机网站微信登录