0

我不想编写自己的登录函数,所以我想使用 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; } ?>

我希望以正确的方式完成此操作,以便一切安全等等。你会这样做还是我做错了什么?我可能会使用 cookie 来代替...

4

1 回答 1

1

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

但是,正如您已经注意到的,LightOpenID 只负责身份验证过程,因此您的应用程序需要收集和存储它所需的身份验证详细信息,因为在每个页面请求上再次进行身份验证会很痛苦。最重要的是身份。身份是一个 URL,它是“登录”或“用户名”的 OpenID 等价物。正如“Configuracion”wiki 页面$openid->identity所解释的那样,您需要在成功验证立即获取它,届时它将更改https://www.google.com/accounts/o8/id为 Google 分配给用户的任何唯一 URL。您可能想知道它:

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

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

  • 使用 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;
}
于 2013-04-11T16:00:02.313 回答