对于OpenID身份验证,我正在使用“PHP OpenID Library”(http://www.janrain.com/openid-enabled)。如何在此库的帮助下,询问其他信息(昵称,电子邮件)?
当我在yandex LightOpenID->上询问电子邮件时,我遇到了LightOpenID的问题。有效返回false(
class Ncw_OpenID extends LightOpenID
{
const OPENID_MODE_CANCEL = 'cancel';
public function __construct()
{
parent::__construct();
$this->required = array('namePerson/friendly', 'contact/email');
$this->optional = array('contact/email');
//$this->returnUrl = 'http://' . SITE_URI . '/users/login';
}
public function getAttributes() {
$attr = parent::getAttributes();
$newAttr = array();
foreach ($attr as $key => $value) {
if (isset(parent::$ax_to_sreg[$key])) $key = parent::$ax_to_sreg[$key];
$newAttr[$key] = $value;
}
return $newAttr;
}
}
class Users_IndexController extends Zend_Controller_Action
{
public function loginAction()
{
$openIDMode = $this->_request->getParam('openid_mode');
$openID = new Ncw_OpenID();
$form = new Users_Form_Login(array('action' => $this->view->url(array(), 'openIDLogin')));
if (null === $openIDMode) {
if ($this->_request->isPost() && $form->isValid($_POST)) {
$openID->identity = $form->getValue('openIDUri');
$this->_redirect($openID->authUrl());
exit();
}
$this->view->content = $form;
} elseif (Ncw_OpenID::OPENID_MODE_CANCEL == $openIDMode) {
$this->view->content = 'Cancel';
} else {
if ($openID->validate()) {
$this->view->content = 'Valid: ' . $openID->identity . ' = ' . var_export($openID->getAttributes(), true);
} else {
$this->view->content = 'Not Valid';
}
$this->view->content .= $form;
}
}
public function logoutAction()
{
// action body
}
}
答案 0 :(得分:1)
Here是一个不完整的例子。它不完整,因为它只使用SREG,并非每个提供商都支持它(例如,Google仅支持AX)。
据我所知,php-openid没有提供一种简单的方法来自动检测服务器支持的内容,因此使用AX或SREG。
有关更多信息,请查看源代码的注释,或者阅读README建议,使用phpdoc生成文档。
但是,如果您可以切换库,我建议LightOpenID。它更容易使用并自动执行大多数操作(与php-openid相反)。