首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OpenID OpenID库从OpenID提供程序获取电子邮件地址

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

Stack Overflow用户
提问于 2011-09-09 14:05:26
回答 1查看 508关注 0票数 1

当我使用谷歌登录到StackOverflow时,我会得到以下信息:

Stackoverflow.com正在询问你的Google帐户example@gmail.com的一些信息 ·电子邮件地址: example@gmail.com

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

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

我也发现很难理解我需要在哪一步要求电子邮件地址。下面是我认为应该将这一步嵌入到其中的代码:

代码语言:javascript
复制
/**
 * 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;
        }
    }
}

这似乎很明显.但我很难在谷歌上搜索并梳理代码来找出答案。任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2011-09-09 15:54:19

您可以使用Zend简单注册分机请求一个电子邮件地址

代码语言:javascript
复制
$sreg = new Zend_OpenId_Extension_Sreg(array(
    'nickname'=>true,
    'email'=>false,
    'fullname'=>false), null, 1.1);
$consumer = new Zend_OpenId_Consumer();
if (!$consumer->login($_POST['openid_identifier'],
                      'example-6_3.php',
                      null,
                      $sreg)) {
    die("OpenID login failed.");
}

如果您想使用珍妮恩库,可以向请求添加如下扩展:

代码语言:javascript
复制
$sreg_request = Auth_OpenID_SRegRequest::build(
                                 // Required
                                 array('nickname'),
                                 // Optional
                                 array('email'));

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

看看消费者示例:https://github.com/openid/php-openid/blob/master/examples/consumer/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7362880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档