10

您好
,我已经在几个小时前下载了 LightOpenID (http://gitorious.org/lightopenid),但仍然不知道如何使其工作。
我把这个谷歌示例保存在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 是我页面的初始化文件(常量、类、函数、数据库连接等)。
运行此代码后,我得到标签为“使用 Google 登录”的按钮,然后按下它

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

提供有关 $openid 对象的一些信息

LightOpenID 对象 ( [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] => 
    )

)

...没什么特别的...就是这样...
我花了很多时间在谷歌搜索教程,但甚至找不到。你能帮我么。
用户如何登录?
我必须从哪里获取登录的用户信息(如用户名、邮件)?
我从来没有使用过开放 ID,我很困惑....
在此先感谢

4

4 回答 4

34

如何登录用户?

在您的示例中,有一行显示如何完成身份验证:

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

如果$openid->validate()返回 true,则表示声称是的用户已通过$openid->identity身份验证。

如果您将其与标准身份验证进行比较:

标准认证:

  • 用户输入登录名和密码
  • 服务器检查是否有这样一对登录名和密码。
  • 如果有,则用户已通过身份验证(使用他提供的登录名),因此我们设置了一个 cookie 来记住他(或您在成功登录时想要执行的任何其他操作)。

OpenID 身份验证(使用 LightOpenID):

  • 用户输入一个 openid 身份
  • 服务器使用 LightOpenID 对其进行身份验证,然后调用$openid->validate()
  • 如果validate()返回 true,则用户已通过身份验证(使用$openid->identity),因此我们设置了一个 cookie 来记住他(或在成功登录时您想做的任何其他事情)。

基本上,一旦您确认用户就是他声称的那个人(即他已经过身份验证),您就可以像普通身份验证一样进行操作。

通常,您必须将身份与会话 ID 一起存储在某处。

我必须从哪里获取登录的用户信息(如用户名、邮件)?

用户名在$openid->identity. 但是,您可能希望使用昵称作为显示名称。但是,获取昵称和电子邮件地址需要额外的配置。基本上,在调用之前$openid->authUrl(),您必须添加:

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

该行将导致 LightOpenID 请求这些参数。您可以在axschema.org上查看其他参数列表(OP 可能支持也可能不支持)。然后,要在调用之后获取这些值validate(),调用$openid->getAttributes()。它将返回所有可用的参数,例如:

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

但是,请注意,此列表可以包含其他参数,并且可能不包含您请求的参数。基本上,OP 可以自由地返回它想要的任何东西,所以你需要为缺少一些值做好准备。

于 2010-10-22T16:48:32.467 回答
5

当用户单击“example-google.php”页面上的“使用 Google 登录”按钮时,您将被重定向到 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();
}
于 2011-07-04T16:27:31.343 回答
2

这个脚本现在可以在我的笔记本电脑上运行 apache 并通过 wifi 连接到互联网的本地主机上正常工作。

有人告诉我,您应该在创建新的 LightOpenId 对象时将其传递给它。

$iniConfig是一个 parse_ini_file 数组,存储在我存储所有重要变量的文档根目录之外。

在这种情况下

[openid] 
domain='mydomain.com' 

因此,我创建了新对象并包含服务器所在的域:

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

我是这样写的,并没有检查它是否可以在没有域的情况下工作..

于 2012-07-20T18:45:28.437 回答
-2

您需要在对外部网络开放端口 80 的服务器上运行它,如果您在 127.0.0.1 上运行它,Google 无法访问您并返回信息

于 2010-10-22T15:42:17.843 回答