Вход в систему с помощью 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 не может получить доступ к вам и вернуть информацию