这是使用openId的方法吗?

时间:2013-04-11 14:12:25

标签: php openid lightopenid

我不想编写自己的登录功能,所以我想使用openId。我找到了lightopenid库,并对google-example文件进行了一些修改,它看起来像这样:

<?php
session_start();
# Logging in with Google accounts requires setting special identity, so this example shows how to do it.
require 'openid.php';
try {
    # Change 'localhost' to your domain name.
    $openid = new LightOpenID('127.0.0.1');
    if(!$openid->mode) {
        if(isset($_GET['login'])) {
            $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($openid->mode == 'cancel') {
        echo 'User has canceled authentication!';
    } else {
        echo 'User ' . ($openid->validate() ? $openid->identity . ' has ' : 'has not ') . 'logged in.';
        if ($openid->validate()) {
            $_SESSION['auth'] = true;
        }
    }
} catch(ErrorException $e) {
    echo $e->getMessage();
}

所以我在那里添加了一个$ _SESSION的东西......现在想我可以在每个受保护页面的顶部使用一些代码,如下所示:

<?php session_start(); 
if (!$_SESSION['auth']) { exit; } ?>

我希望这是以正确的方式完成的,这样一切都是安全的等等。你会这样做,还是我做错了什么?我可能会用饼干代替......

1 个答案:

答案 0 :(得分:1)

我没有尝试过您的代码,但如果它基于bundled Google example则应该没问题。当然,使用此代码,您的网站不对任何OpenID所有者开放,只对Google用户开放。

但是,正如您已经注意到的,LightOpenID只负责身份验证过程,因此您的应用程序需要收集并存储所需的身份验证详细信息,因为在每个页面请求上再次进行身份验证会很麻烦。最重要的是身份。标识是一个URL,它的OpenID等同于“login”或“username”。正如"Configuracion" wiki page所解释的那样,您需要在成功验证后从$openid->identity获取它,当它从https://www.google.com/accounts/o8/id更改为Google已分配给的任何唯一网址时用户。你可能想知道它:

  • 您可以为不同的用户分配不同的权限。
  • 您可以在不同的会话中识别用户。

现在,您应该如何存储身份?

  • 使用cookie来确定用户是否经过身份验证是最糟糕的解决方案。你不需要成为黑客就可以打破这种局面 - 所有现代浏览器都包含易于使用的GUI工具来编辑cookie。

  • 服务器端会话是行业标准。在我关于身份的评论之后,我至少会存储这个:

    $_SESSION['openid'] = $openid->identity;
    
  • 除会话外,如果您生成的用户数据需要在会话中保持不变,则需要一个数据库。 (这取决于您的需求。)

修改

您无法验证两次,因为请求已过期。这是一种安全机制。如果需要重复使用,请将其存储到变量中:

$is_valid = $openid->validate();
echo 'User ' . ($is_valid ? $openid->identity . ' has ' : 'has not ') . 'logged in.';
if ($is_valid) {
    $_SESSION['auth'] = true;
}