Вход в систему с помощью LightOpenID

Здравствуйте
Я загрузил LightOpenID (http://gitorious.org/lightopenid) несколько часов назад, но все еще не могу понять, как заставить его работать.
Я получил этот пример Google, сохраненный в файле test.php

<?php
require '../lib/init.php';
require '../lib/openID/openid.php';

try {
    if(!isset($_GET['openid_mode'])) {
        if(isset($_GET['login'])) {
            $openid = new LightOpenID;
            $openid->identity = 'https://www.google.com/accounts/o8/id';
            header('Location: ' . $openid->authUrl());
        }
?>
<form action="?login" method="post">
    <button>Login with Google</button>
</form>
<?php
    } elseif($_GET['openid_mode'] == 'cancel') {
        echo 'User has canceled authentication!';
    } else {
        $openid = new LightOpenID;
        echo 'User ' . ($openid->validate() ? $openid->identity . ' has ' : 'has not ') . 'logged in.';
    }
} catch(ErrorException $e) {
    echo $e->getMessage();
}
echo '<pre>'.print_r($openid,true).'</pre>';
?>

Где init.php - это файл инициализации для моей страницы (константы, классы, функции, соединение db и т.д.).
После запуска этого кода я получил кнопку с меткой "Войти с Google" и после нажатия на нее

echo '<pre>'.print_r($openid,true).'</pre>';

введите некоторую информацию об объекте $openid

Объект LightOpenID (     [returnUrl] = > http://kur.com/openid.php    [required] = > Массив         (         )

[optional] => Array
    (
    )

[identity:LightOpenID:private] => https://www.google.com/accounts/o8/id
[claimed_id:LightOpenID:private] => https://www.google.com/accounts/o8/id
[server:protected] => https://www.google.com/accounts/o8/ud
[version:protected] => 2
[trustRoot:protected] => http://kur.com
[aliases:protected] => 
[identifier_select:protected] => 1
[ax:protected] => 1
[sreg:protected] => 
[data:protected] => Array
    (
        [login] => 
    )

)

... ничего особенного... и это... Я трачу много времени на поиск учебников в Google, но не могу найти ни одного. Не могли бы вы помочь мне. Как войти в систему? Откуда я должен получить информацию о пользователе (как имя пользователя, почту)?
Я никогда не использовал открытый идентификатор, и я смущен.... Спасибо заранее

Ответ 1

Этот script теперь отлично работает на моем локальном хосте, запущенном apache на моем ноутбуке с Wi-Fi-подключением к Интернету.

Мне сказали, что вы должны передать свой домен новому объекту LightOpenId при его создании.

$iniConfig - это массив parse_ini_file, хранящийся вне корня документа, где я храню все мои важные переменные.

в этом случае

[openid] 
domain='mydomain.com' 

Итак, я создаю новый объект и включаю домен, на котором находится сервер:

$openid = new LightOpenID($iniConfig['openid']['domain']);

Я написал его таким образом и не проверял, работает ли он без домена.

Ответ 2

Как войти в систему пользователя?

В вашем примере есть строка, показывающая, как завершить аутентификацию:

echo 'User ' . ($openid->validate() ? $openid->identity . ' has ' : 'has not ') . 'logged in.';

Если $openid->validate() возвращает true, это означает, что пользователь, который утверждает, что он $openid->identity, аутентифицирован.

Если вы сравните его со стандартной аутентификацией:

Стандартное разрешение:

  • Пользователь вводит логин и пароль
  • Сервер проверяет наличие такой пары логинов и паролей.
  • Если есть, пользователь аутентифицируется (с логином, который он предоставил), поэтому мы установили cookie, чтобы запомнить его (или все, что вы хотите сделать при успешном входе в систему).

OpenID auth (с LightOpenID):

  • Пользователь вводит идентификатор openid
  • Сервер использует LightOpenID для его аутентификации, затем вызывает $openid->validate()
  • Если validate() возвращает значение true, пользователь аутентифицируется (с помощью $openid->identity), поэтому мы устанавливаем cookie для его запоминания (или что бы вы еще ни делали в успешном входе в систему).

В принципе, как только вы подтверждаете, что пользователь является тем, кем он утверждает, что он (т.е. он аутентифицирован), вы продолжаете, как если бы это был нормальный auth.

Обычно вы должны где-то хранить идентификатор, а также идентификатор сеанса.

Откуда я должен регистрировать информацию пользователя (как имя пользователя, почту)?

Имя пользователя находится в $openid->identity. Однако вы можете использовать псевдоним как отображаемое имя. Однако получение псевдонима и адреса электронной почты требует дополнительной настройки. В принципе, перед вызовом $openid->authUrl() вам нужно будет добавить:

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

Эта строка заставит LightOpenID запрашивать эти параметры. Вы можете увидеть список других параметров (которые могут поддерживаться или не поддерживаться OP) в axschema.org. Затем, чтобы получить значения этих, после вызова validate(), вызовите $openid->getAttributes(). Он вернет все доступные параметры, например:

array(
    [namePerson/friendly] => Mewp
    [contact/email] => [email protected]
)

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

Ответ 3

когда пользователь нажал кнопку "Войти с помощью Google" на странице "example-google.php", вы будете перенаправлены в Google, и если пользователь примет запрос, он будет перенаправлен на вашу страницу снова, и вы можете получить только Openid из пользователь.

Но если вы хотите получить другую информацию или изменить OpenID, вы можете сделать это следующим образом:

<?php
require 'openid.php';
try {
$openid = new LightOpenID;
if(!$openid->mode) {
    if(isset($_GET['oidType'])) {
$oidType = $_GET['oidType'];
$openid = new LightOpenID;
    if ($oidType==1)
    {
        $openid->identity = 'https://www.google.com/accounts/o8/id';
    }
    else
    {
        $openid->identity = 'https://me.yahoo.com ';
    }
    $openid->required = array(
      'namePerson',
      'namePerson/first',
      'namePerson/last',
      'contact/email',
    );
    $openid->returnUrl = 'http://www.yourdomain.com/login.php';
    header('Location: ' . $openid->authUrl());

    }
?>
<a href="?oidType=1">Login with Google</a>
<a href="?oidType=2">Login with Yahoo</a>
<?php
} elseif($openid->mode == 'cancel') {
    echo 'User has canceled authentication!';
} 

} elseif($openid->validate()) {
$openid_identity = $openid->identity;
    $data = $openid->getAttributes();
    $email = $data['contact/email'];
    $namePerson = $data['namePerson'];
    $first = $data['namePerson/first'];
    $last = $data['namePerson/last'];

echo "Openid:$identitystr <br>";
    echo "Email : $email <br>";
    echo "namePerson : $namePerson <br>";
    echo "first : $first <br>";
    echo "last : $last <br>";

} else {
    echo "The user has not logged in";
}
} catch(ErrorException $e) {
echo $e->getMessage();
}

Ответ 4

Вам нужно запустить его на сервере с портом 80, открытым для внешней сети, если вы запустите его на 127.0.0.1 Google не может получить доступ к вам и вернуть информацию