Войдите в систему пользователя с LightOpenID - PullRequest
10 голосов
/ 22 октября 2010

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

<code><?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).'
'; ?>

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

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

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

LightOpenID Object ( [returnUrl] => http://kur.com/openid.php [обязательно] => массив ( )

[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, но не могу найти ни одного. Можете ли вы помочь мне.
Как войти в систему пользователя?
Откуда я должен получить информацию о зарегистрированном пользователе (как имя пользователя, почта)?
Я никогда не использовал открытый ID, и я в замешательстве ....
Заранее спасибо

Ответы [ 4 ]

34 голосов
/ 22 октября 2010

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

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

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

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

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

Стандартный auth:

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

OpenID auth (с LightOpenID):

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

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

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

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

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

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

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

array(
    [namePerson/friendly] => Mewp
    [contact/email] => mewp@example.com
)

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

5 голосов
/ 04 июля 2011

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

Но если вы хотите получить какую-либо другую информацию или изменить 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();
}
2 голосов
/ 20 июля 2012

Этот скрипт теперь работает нормально с моего локального хоста apache на моем ноутбуке с Wi-Fi-соединением с интернетом.

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

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

в этом случае

[openid] 
domain='mydomain.com' 

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

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

Я написал это таким образом, и убежищепроверил, работает ли он без домена ..

0 голосов
/ 22 октября 2010

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

...