不管是不是PHP,在基于HTTP的通信中进行基本认证的过程如下。
首先,假设您创建了一个需要用户身份验证的页面。当客户端请求查看页面时,检查“Authorization”的标头。客户端第一次访问时通常不会出现这种情况。
要在 PHP 中进行检查,请检查预定义变量“$_SERVER”的值。“$_SERVER” 是一个包含标题、路径和脚本位置等信息的数组。检查此数组中是否有对应于“PHP_AUTH_USER”的值。
if (!isset($_SERVER['PHP_AUTH_USER'])){
}
上面使用的“isset”函数是一个检查变量是否被设置的函数。
isset
bool isset ( mixed var [, mixed var [, ...]] )
如果没有「Authorization」的标头,服务器会指示客户端在浏览器中显示授权对话框。为此,请使用“Authorization”功能并将其描述如下。
if (!isset($_SERVER['PHP_AUTH_USER'])){
header('WWW-Authenticate: Basic realm="Private Page"');
header('HTTP/1.0 401 Unauthorized');
}
“Authorization”功能用于将原始 HTTP 标头发送到客户端。我将跳过详细说明,但是如果您像上面那样将其发送到客户端,则认证屏幕将显示在客户端的浏览器上。
如果在验证屏幕上按取消,程序的处理将在以下位置进行。
if (!isset($_SERVER['PHP_AUTH_USER'])){
header('WWW-Authenticate: Basic realm="Private Page"');
header('HTTP/1.0 401 Unauthorized');
/* 如果按下取消 */
}
如果按下取消,则显示错误并终止程序。
if (!isset($_SERVER['PHP_AUTH_USER'])){
header('WWW-Authenticate: Basic realm="Private Page"');
header('HTTP/1.0 401 Unauthorized');
die('查看此页面需要登录');
}
如果在身份验证对话框中输入用户名和密码后按“确定”按钮,将再次向服务器发出请求,并添加在“Authorization”标题中输入的用户名和密码信息。
因此,再次检查该值是否设置为 $_SERVER[‘PHP_AUTH_USER’]。即使在认证对话框的用户名部分没有输入任何内容,该值似乎设置为 NULL,所以无论如何,如果您在认证对话框中按下“确定”按钮,就会设置该变量值。因此,处理移动到下一个位置。
if (!isset($_SERVER['PHP_AUTH_USER'])){
header('WWW-Authenticate: Basic realm="Private Page"');
header('HTTP/1.0 401 Unauthorized');
die('查看此页面需要登录');
}else{
/* 当在身份验证对话框中按下 OK 时,处理移至此处 */
}
现在需要判断用户名和密码是否正确。其实我觉得你会参考数据库里预先注册的用户名和密码来查,这里我用固定的用户名和密码来查。
if (!isset($_SERVER['PHP_AUTH_USER'])){
header('WWW-Authenticate: Basic realm="Private Page"');
header('HTTP/1.0 401 Unauthorized');
die('查看此页面需要登录'');
}else{
if ($_SERVER['PHP_AUTH_USER'] != $user
|| $_SERVER['PHP_AUTH_PW'] != $password){
header('WWW-Authenticate: Basic realm="Private Page"');
header('HTTP/1.0 401 Unauthorized');
die('查看此页面需要登录');
}
}
在认证对话框中输入的用户名为$_SERVER[‘PHP_AUTH_USER’],密码可以通过$_SERVER[‘PHP_AUTH_PW’]获取。例如,只有当用户名为“admin”,密码为“pass”时才能通过认证,则如下所示。
$user = 'admin';
$password = 'pass';
if (!isset($_SERVER['PHP_AUTH_USER'])){
header('WWW-Authenticate: Basic realm="Private Page"');
header('HTTP/1.0 401 Unauthorized');
die('查看此页面需要登录');
}else{
if ($_SERVER['PHP_AUTH_USER'] != $user
|| $_SERVER['PHP_AUTH_PW'] != $password){
header('WWW-Authenticate: Basic realm="Private Page"');
header('HTTP/1.0 401 Unauthorized');
die('查看此页面需要登录');
}
}
/* 如果认证成功了,就会处理来了这里*/
以上是一个简单的认证流程。
示例代码
让我们用一个简单的例子来尝试一下。
<?php
$user = 'admin';
$password = 'pass';
if (!isset($_SERVER['PHP_AUTH_USER'])){
header('WWW-Authenticate: Basic realm="Private Page"');
header('HTTP/1.0 401 Unauthorized');
die('查看此页面需要登录');
}else{
if ($_SERVER['PHP_AUTH_USER'] != $user
|| $_SERVER['PHP_AUTH_PW'] != $password){
header('WWW-Authenticate: Basic realm="Private Page"');
header('HTTP/1.0 401 Unauthorized');
die('查看此页面需要登录'');
}
}
?>
<html>
<head><title>PHP TEST</title></head>
<body>
<p>欢迎来到我们的会员页面</p>
</body>
</html>
如果将上述文件安装在WWW服务器上,通过浏览器查看,将显示如下。