我不想编写自己的登录功能,所以我想使用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; } ?>
我希望这是以正确的方式完成的,这样一切都是安全的等等。你会这样做,还是我做错了什么?我可能会用饼干代替......
答案 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;
}