Как реализовать openid google, yahoo и др.

Я пытаюсь реализовать OpenID и для этого загружаю http://www.openidenabled.com/php-openid и из этого я взял папку Auth, изменив что-либо на каталог localhost, и создал файл index.php, код которого выглядит следующим образом:

<?php
    if (!isset($_POST['submit'])) {
?>
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
        "DTD/xhtml1-transitional.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
        <head>
        <title>OPENID TESTING</title>
        </head>
        <body>
        <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
            Sign in with your OpenID: <br/>
            <input type="text" name="id" size="30" />
            <br />
            <input type="submit" name="submit" value="Log In" />
        </form>
        </body>
        </html>
<?php
    } else {

        // check for form input
        if (trim($_POST['id'] == '')) {
            die("ERROR: Please enter a valid OpenID.");
        }

        // include files
        require_once "Auth/OpenID/Consumer.php";
        require_once "Auth/OpenID/FileStore.php";

        // start session (needed for YADIS)
        session_start();

        // create file storage area for OpenID data
        $store = new Auth_OpenID_FileStore('./oid_store');

        // create OpenID consumer
        $consumer = new Auth_OpenID_Consumer($store);

        // begin sign-in process
        // create an authentication request to the OpenID provider

        $auth = $consumer->begin($_POST['id']);
        if (!$auth) {
            die("ERROR: Please enter a valid OpenID.");
        }

        // redirect to OpenID provider for authentication
        $url = $auth->redirectURL('http://localhost/', 'http://localhost/oid_return.php');
        header('Location: ' . $url);
    }
?>

Теперь, когда я пытаюсь заполнить идентификатор от worldpress или myopenid.com, он распознается и перенаправляет меня на страницу провайдера для аутентификации, но этого не происходит в случае с Google, Yahoo или другими поставщиками услуг. Что мне нужно реализовать для Google или Yahoo


person Vineet1982    schedule 18.05.2011    source источник


Ответы (1)


Я использую библиотеку PHP LightOpenID (см. на gitorious), чтобы пользователи могли войти в мой веб-сайт с их учетной записью Google. Для другого поставщика OpenID вам просто нужно изменить поле $openid->identity. Он обрабатывает весь поток аутентификации для нас. Вам не нужно беспокоиться о токенах и прочем.

Вот страница, на которой я показываю ссылку «Войти через Google»:

<?php
require_once 'openid.php';
$openid = new LightOpenID;

$openid->identity = 'https://www.google.com/accounts/o8/id';
$openid->required = array('contact/email');
$openid->returnUrl = 'http://my-website.com/landing-login.php'
?>

<a href="<?php echo $openid->authUrl() ?>">Login with Google</a>

Когда вы нажмете на ссылку, появится страница Google с просьбой пройти аутентификацию и / или разрешить вам получить его электронную почту.

Затем он будет перенаправлен на целевую страницу $openid->returnUrl. Код для этой страницы должен быть:

<?php
require_once 'openid.php';
$openid = new LightOpenID;

if ($openid->mode) {
    if ($openid->mode == 'cancel') {
        // User has canceled authentication
    } elseif($openid->validate()) {
        // Yeah !
        $data = $openid->getAttributes();
        $email = $data['contact/email'];
    } else {
        // The user has not logged in via Google
    }
} else {
    // The user does not come from the link of the first page
}
?>

Если вы хотите получить больше информации от пользователя, вы должны добавить их в $openid->required на первой странице. Например :

$openid->required = array(
  'contact/email',
  'namePerson/first',
  'namePerson/last'
);

позволит вам, если пользователь примет это, получить его имя и фамилию на второй странице:

$name = $data['namePerson/first'] . " " . $data['namePerson/last'];

Надеюсь, это поможет !

person Quentin    schedule 30.05.2011
comment
Я попытался добавить «namePerson/first», «namePerson/last». Кажется, это не работает ни с Google, ни с Yahoo (я получаю адрес электронной почты и другие значения). Есть идеи, почему? - person Itay Moav -Malimovka; 08.08.2013