三、ticket使用实例
在下面这个程序中,我们将见到我们在第二个示例程序中所讲的ticket的实际应用,通过这个程序,我们将进一步了解ticket。
<HTML>
<HEAD><TITLE>php3 auth library check</TITLE></HEAD>
<?php
include( "authticket.php");
function print_auth($auth, $verf, $tix, $fail)
{
print "<TR>";
if ($tix->authenticated == 0)
if ($fail == "FAIL")
print "<TD>FAIL</TD><TD>FAIL</TD>";
else {
print "<TD><FONT COLOR=\"red\">PASS</FONT></TD>";
print "<TD><FONT COLOR=\"red\">FAIL</FONT></TD>";
}
else
if ($fail == "PASS")
print "<TD>PASS</TD><TD>PASS</TD>";
else {
print "<TD><FONT COLOR=\"red\">FAIL</FONT></TD>";
print "<TD><FONT COLOR=\"red\">PASS</FONT></TD>";
}
print "<TD>$tix->autherr</TD><TD>$verf</TD><TD>$auth</TD></TR>\n";
}
$tix = new authticket;
$tix->secret = "Now is the time for all good men...x";
$tix->realm = "TestRealm";
?>
<BODY>
<table border="1">
<TR><TH COLSPAN="3">Pass/Fail</TH><TH></TH><TH></TH></TR>
<TR><TH>Should</TH><TH>Did</TH><TH>Reason</TH><TH>Identity</TH><TH>Ticket</TH></TR>
<?php
/*
* 下面我们给出对ticket验证的一个最简单的例子
*/
$auth = $tix->makeauth( "explorer", 10);
$verf = $tix->checkauth($auth, 10);
print_auth($auth, $verf, $tix, "PASS");
/*
* 下面我们验证一个过期的ticket
*/
$tix->lifetime = 10; // 有效期10秒
$auth = $tix->makeauth( "explorer", 50); // 时间为50时生成ticket
$verf = $tix->checkauth($auth, 80); // 时间为80时使用ticket
print_auth($auth, $verf, $tix, "FAIL"); // 失败
/*
* 验证一个未发行的ticket
*/
$tix->lifetime = 10; // 有效期10秒
$auth = $tix->makeauth( "explorer", 80); // 时间为80时生成ticket
$verf = $tix->checkauth($auth, 50); // 时间为50时使用ticket
print_auth($auth, $verf, $tix, "FAIL"); // 失败
/*
* 取消有效期检查
*/
$tix->lifetime = 0; // 不设置有效期检查
$auth = $tix->makeauth( "explorer", 50); // 时间为50时生成ticket
$verf = $tix->checkauth($auth, 80); // 时间为90时使用ticket
print_auth($auth, $verf, $tix, "PASS"); // 通过
$tix->lifetime = 10; // 重新设置为效期为10秒
/*
* 下面我们看看如果有人改变了hash会发生什么(在我们的举例中,密钥被改变)
*/
$auth = $tix->makeauth( "explorer", 50);
$tix->secret = $tix->secret . "foobar";
$verf = $tix->checkauth($auth, 55);
print_auth($auth, $verf, $tix, "FAIL"); // 失败
/*
* 改变远端的IP地址
*/
$auth = $tix->makeauth( "explorer", 50);
$REMOTE_ADDR = "512.412.211.212"; // 不合法的IP地址,将无法通过
$verf = $tix->checkauth($auth, 55);
print_auth($auth, $verf, $tix, "FAIL"); // 失败
//
// 不同的身份
//
$auth = $tix->makeauth( "explorer", 0);
$tix->realm = "DifferentRealm";
$verf = $tix->checkauth($auth, 0);
print_auth($auth, $verf, $tix, "FAIL"); // 失败
?>
</table>
</BODY></HTML>
事实上这个程序是我们在这个教程中接触到的第一个真正的动态网页,大家在学习php时,我相信有很多人是向着php的动态特性来,而如何用php来编写一个动态的网页,我们一般的做法是首先将动态网页中的静态内容先分离出来,然后使用我们熟悉的网页制作工具来编写出这个静态的网页,这时候我们的文件的扩展名是.html,现在我们将该文件的扩展名改为.php,这时候,通过服务器的解释,你的这个文件在客户端仍可以正常显示。下面我们可以就开始添加动态的内容了。这时候,我们要用到echo或print,我的习惯是使用echo,在很多场合,echo和print是完全等价的。事实上,你可以把echo和print理解为在php插入html语句的一个关键字,也就是说在<?php ?>括起来的一段php语句中,要插入html语句,必须通过echo和print来实现。
程序执行后,在客户端看到的是这样的HTML源文件:
<HTML>
<HEAD><TITLE>php3 auth library check</TITLE></HEAD>
<BODY>
<table border="1">
<TR><TH COLSPAN="3">Pass/Fail</TH><TH></TH><TH></TH></TR>
<TR><TH>Should</TH><TH>Did</TH><TH>Reason</TH><TH>Identity</TH><TH>Ticket</TH></TR>
<TR><TD>PASS</TD><TD>PASS</TD><TD></TD><TD>explorer</TD><TD>4cd47affcf2605332963b6acc4f8b017:10:TestRealm:61.147.93.2:explorer</TD></TR>
<TR><TD>FAIL</TD><TD>FAIL</TD><TD>Ticket expired</TD><TD></TD><TD>af679e5c5fe2117070b2f186aff33d85:50:TestRealm:61.147.93.2:explorer</TD></TR>
<TR><TD>FAIL</TD><TD>FAIL</TD><TD>Ticket used before issued</TD><TD></TD><TD>84169fe8960e060e3f06fd45462e5389:80:TestRealm:61.147.93.2:explorer</TD></TR>
<TR><TD>PASS</TD><TD>PASS</TD><TD></TD><TD>explorer</TD><TD>af679e5c5fe2117070b2f186aff33d85:50:TestRealm:61.147.93.2:explorer</TD></TR>
<TR><TD>FAIL</TD><TD>FAIL</TD><TD>Integrity check failed</TD><TD></TD><TD>af679e5c5fe2117070b2f186aff33d85:50:TestRealm:61.147.93.2:explorer</TD></TR>
<TR><TD>FAIL</TD><TD>FAIL</TD><TD>Address mismatch</TD><TD></TD><TD>253ccf4eb3fc87ce4336f4088a407b38:50:TestRealm:61.147.93.2:explorer</TD></TR>
<TR><TD>FAIL</TD><TD>FAIL</TD><TD>Realm mismatch</TD><TD></TD><TD>f43eaeec2a52511984438769f65ca3be:979052707:TestRealm:512.412.211.212:explorer</TD></TR>
</table>
</BODY></HTML>
|