Php 使用Janrain OpenID库从OpenID提供程序获取电子邮件地址

Php 使用Janrain OpenID库从OpenID提供程序获取电子邮件地址,php,zend-framework,openid,janrain,Php,Zend Framework,Openid,Janrain,当我使用Google登录StackOverflow时,我收到以下消息: Stackoverflow.com正在向您的Google帐户询问一些信息example@gmail.com •电子邮件地址:example@gmail.com 然而,在我自己的网站上,当我使用OpenID登录时,我无法询问电子邮件地址。相反,我得到的信息是: 您正在使用您的Google帐户登录example.comexample@gmail.com 我还发现很难理解在哪一步我需要请求电子邮件地址。以下是我认为该步骤应该内置的

当我使用Google登录StackOverflow时,我收到以下消息:

Stackoverflow.com正在向您的Google帐户询问一些信息example@gmail.com

•电子邮件地址:example@gmail.com

然而,在我自己的网站上,当我使用OpenID登录时,我无法询问电子邮件地址。相反,我得到的信息是:

您正在使用您的Google帐户登录example.comexample@gmail.com

我还发现很难理解在哪一步我需要请求电子邮件地址。以下是我认为该步骤应该内置的代码:

/**
 * Authenticates the given OpenId identity.
 * Defined by Zend_Auth_Adapter_Interface.
 *
 * @throws Zend_Auth_Adapter_Exception If answering the authentication query is impossible
 * @return Zend_Auth_Result
 */
public function authenticate() {
    $id = $this->_id;
    $consumer = new Auth_OpenID_Consumer($this->_storage);
    
    if (!empty($id)) {
        $authRequest = $consumer->begin($id);
        
        if (is_null($authRequest)) {
            return new Zend_Auth_Result(
                Zend_Auth_Result::FAILURE,
                $id,
                array("Authentication failed", 'Unknown error')
            );
        }
        
        if (Auth_OpenID::isFailure($authRequest)) {
            return new Zend_Auth_Result(
                Zend_Auth_Result::FAILURE,
                $id,
                array("Authentication failed", "Could not redirect to server: " . $authRequest->message)
            );
        }
        
        $redirectUrl = $authRequest->redirectUrl($this->_root, $this->_returnTo);
        
        if (Auth_OpenID::isFailure($redirectUrl)) {
            return new Zend_Auth_Result(
                Zend_Auth_Result::FAILURE,
                $id,
                array("Authentication failed", $redirectUrl->message)
            );
        }
        
        Zend_OpenId::redirect($redirectUrl);
    } else {
        $response = $consumer->complete(Zend_OpenId::selfUrl());

        switch($response->status) {
            case Auth_OpenID_CANCEL:
            case Auth_OpenID_FAILURE:
                return new Zend_Auth_Result(
                    Zend_Auth_Result::FAILURE,
                    null,
                    array("Authentication failed. " . @$response->message)
                );
                break;
            case Auth_OpenID_SUCCESS:
                return $this->_constructSuccessfulResult($response);
                break;
        }
    }
}

这似乎是显而易见的。。。但我很难用谷歌搜索它,并通过代码来找出它。任何帮助都将不胜感激

您可以使用

如果要使用Janrain库,可以向请求添加扩展,如下所示:

$sreg_request = Auth_OpenID_SRegRequest::build(
                                 // Required
                                 array('nickname'),
                                 // Optional
                                 array('email'));

if ($sreg_request) {
    $authRequest->addExtension($sreg_request);
}

看看消费者示例:

您可以使用

如果要使用Janrain库,可以向请求添加扩展,如下所示:

$sreg_request = Auth_OpenID_SRegRequest::build(
                                 // Required
                                 array('nickname'),
                                 // Optional
                                 array('email'));

if ($sreg_request) {
    $authRequest->addExtension($sreg_request);
}
请看消费者示例: