Получить адрес электронной почты от провайдера OpenID, используя библиотеку Janrain OpenID - PullRequest
1 голос
/ 09 сентября 2011

Когда я вхожу в StackOverflow с помощью Google, я получаю следующее сообщение:

Stackoverflow.com запрашивает некоторую информацию из вашей учетной записи Google example@gmail.com

• Адрес электронной почты: example@gmail.com

Однако, на моем собственном сайте, когда я вхожу с OpenID, я не могу запросить адрес электронной почты. Вместо этого я получаю это сообщение:

Вы входите на сайт example.com с помощью своей учетной записи Google example@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;
        }
    }
}

Кажется, это должно быть так очевидно ... но мне трудно найти его и поискать код. Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 09 сентября 2011

Вы можете запросить адрес электронной почты, используя Zend Simple Registration Extension

$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.");
}

Если вы хотите использовать библиотеку Janrain, вы можете добавить расширения к запросу следующим образом:

$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/

...