HTTP RFC2617 里规定的两种标准的认证方式(Baisc,Digest)与常见的SESSION机制不同。HTTP认证是无状态的,在HTTP-HEADER里传输。而SESSION则在服务端要维护,通过客户端发送SESSIONID来标识不同的用户。
一个HTTP BASIC认证的例子:
<?php
/*
* To change this template, please replace echo using your implement
*/
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="Hellotianma Login"');
header('HTTP/1.1 401 Unauthorized');
} else {
echo "<p>用户名:{$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>密码: {$_SERVER['PHP_AUTH_PW']} </p>";
}
return;
?>
当没登录前,PHP会生成一个HTTP的头:
WWW-Authenticate: Basic realm="Hellotianma Global Login"
并且会生成401 Unauthorized的响应码。此时,浏览器会自动弹出登录窗口,要求用户名和密码验证。
假设用户名输入hello,密码输入world
则登录后,浏览器会保存这个认证,只要浏览器不关闭,每次这个网站的HTTP请求,浏览器都会自动添加一个HTTP已经认证后头:
Authorization: Basic aGVsbG86d29ybGQ=
如果是Firefox,可能要清除Active Login才能让浏览器删除保存的认证信息。IE和Chrome关闭就没有了。
也可由Ajax或者其它HTTP客户端来生成这个认证信息,此时认证后的头由下面步骤生成:
1. $userInfo = $userName . ':' . $userPassword
2. header('Authorization: ' . 'Basic ' . base64_encode($userInfo))
注:PHP用“.”来表示字符串加法,C/C++/C#/Java/JavaScript等用“+”来表示。
如果采用SoapClient来调用基于HTTP基本认证的Web服务,可以:
$soapClient = new SoapClient($newUrl, array('encoding'=>'utf-8', 'trace' => 1, 'login'=>'%USERNAME%', 'password'=>'%PASSWORD%'));
用你的用户名和密码来分别替换%USERNAME%和%PASSWORD%即可实现HTTP基本认证。