PHP HTTP认证
我们浏览的网页一般采用超文本传输协议HTTP,它是用于互联网上向网络浏览器传输网页的传输协议。
但HTTP也有自己的一套认证机制,如同开启了验证,会弹出对话框,需要用户输入用户名和密码,只有验证通过了才可以继续浏览网页。
在PHP中,当一个动态网页(以PHP结尾的文件)被请求时,会用全局变量(系统自定义)来存储验证的用户名和密码。
$_SERVER[‘PHP_AUTH_USER’] 用于验证提交的用户名
$_SERVER[‘PHP_AUTH_PW’] 用于存储验证提交的密码
如果当前提交的用户名和密码验证失败,则可以拒绝继续访问网页。
$authorization = false;
if($_SERVER['PHP_AUTH_USER'] == "admin" && $_SERVER['PHP_AUTH_PW'] == "123")
{
echo "login";
$authorization = true;
}
if(!$authorization)
{
header("WWW-Authenticate:Basic realm='Private'");
header('HTTP/1.0 401 Unauthorized');
print "You are unauthorized to enter this area.";
}
?>
那么我们再深入地讨论一下,整个过程的细节是怎么时行协议交互的呢?
1.首先,我们在浏览器中输入有验证机制的网页时,浏览器会发送GET方式的HTTP协议。
格式不懂的大家可以在网页中搜索查看一下http协议
GET /test.php HTTP/1.1
Host: www.bytekits.com
2.服务器收到来自客户端的请求后,服务器解析PHP文件,在PHP文件中发现用户名和密码验证失败,故返回给客户端401状态码。
服务器的响应如下:
HTTP/1.1 401 Authorization Required
Data:Sun,25,Feb 2018 15:51:20 GMT
Server:Apache/1.3.27 (Unix) PHP/4.3.1
X-Powerd-By: PHP/4.3.1
WWW-Authenticate: Basic realm="PHP Secured"
Connection:close
Content-Type: text/html
没有传输太多的信息,但我们注意到状态码
HTTP/1.1 401 Authorization Required 和 WWW-Authenticate: Basic realm=”PHP Secured”
这些HTTP返回元素都表明了此文件需要进行HTTP的安全保护验证。这时浏览器解析返回一个请输入用户名和密码的对话框,当输入正确后,浏览器第二次进行数据提交,这次提交变成了
GET /test.php HTTP/1.1
Host: www.bytekits.com
Authorization:Basic xxxxxx
Basic后的xxxxx是实际用户输入后的用户名和密码Base64后的字符串,这时服务器收到此请求后,解析出用户名和密码到$_SERVER对应的数组进行二次验证,如通过则正常访问网页,如失败,则重复返回401状态码进行验证。