我有两个页面:login.php和return.php.两者都使用LightOpenID。
页面login.php创建一个指向OpenID提供程序的链接,并告诉该提供程序将结果返回到return.php
以下是使用这两页的正常流程。
- 转到login.php并单击链接
- 使用Google帐户登录
- 系统重定向到return.php并显示User。。。已登录
然而,稍后,我可以通过粘贴return的URL及其查询字符串(从步骤3复制),使return.php即使不执行步骤2,也能说同样的话。
我怎么知道用户真的使用OpenID登录,或者只是粘贴上一次登录的URL?
这是代码:
login.php
<?php
require_once 'openid.php';
$openid = new LightOpenID("mydomain.com");
$openid->identity = 'https://www.google.com/accounts/o8/id';
$openid->returnUrl = 'http://mydomain.com/return.php'
?>
<a href="<?= $openid->authUrl() ?>">Login</a>
return.php
<?php
require_once 'openid.php';
$openid = new LightOpenID("mydomain.com");
if($openid->mode) {
echo 'User ' . ($openid->validate() ? $openid->identity . ' has ' : 'has not ') . 'logged in.';
} elseif($openid->mode == 'cancel') {
echo 'User has canceled authentication!';
} else {
echo 'Please go to login.php';
}
?>
$openid->validate()
每次身份验证只返回true
一次。如果用户尝试使用完全相同的url(即相同的nonce等)再次登录,$openid->validate()
将返回false。至少,如果提供者按照规范工作,情况就是这样。如果不这样,你几乎无能为力。
LightOpenId的文档没有帮助。但这个问题可能会有所帮助:链接