很多驗證都採用這種驗證方式,尤其在嵌入式領域中。
優點:方便
缺點:這種認證方式在傳輸過程中採用的用戶名密碼加密方式爲BASE-64,其解碼過程非常簡單,如果被嗅探密碼幾乎是透明的.
服務器收到請求後,首先會解析發送來的數據中是否包含有:
Authorization: Basic XXXX=這種格式的數據
如果沒有這樣的header數據
那麼服務器會發送HTTP信息頭WWW-Authenticate: Basic realm=""到瀏覽器
要求瀏覽器發送合法的用戶名和密碼到服務端,爲了進一步告知瀏覽器,這個頁面需要認證 我們最還還是接着發送一個401錯誤
Header("HTTP/1.0 401 Unauthorized");
用戶輸入用戶名:admin 密碼:admin後,瀏覽器將以下面這種格式將數據發送給服務器端:Authorization: Basic YWRtaW46YWRtaW4=
Authorization: Basic爲www-authenticate認證的標準HTTP信息頭
YWRtaW46YWRtaW4=是經BASE-64加密後的用戶名和密碼
經解密後的格式爲 admin:admin
這時我們就可以用過PHP的全局變量來使用它們了
$_SERVER['PHP_AUTH_USER'];
$_SERVER['PHP_AUTH_PW'];
路由器都是這麼做的
if(!isset($_SERVER['PHP_AUTH_USER']) && !isset($_SERVER['PHP_AUTH_PW'])){
Header("WWW-Authenticate: Basic realm=\"USER LOGIN\"");
Header("HTTP/1.0 401 Unauthorized");
} else {
echo $_SERVER['PHP_AUTH_USER'];
echo $_SERVER['PHP_AUTH_PW'];
}
--------------------------------------
http://tool.chinaz.com/Tools/Base64.aspx
比如java的http請求認證:
Base64加密碼:Z3Vlc3Q6Z3Vlc3Q=
表示:guest:guest
HttpGet httpGet = new HttpGet("http://192.168.1.10:55672/api/queues");
httpGet.setHeader("Authorization", "Basic Z3Vlc3Q6Z3Vlc3Q=");
try {
HttpResponse httpResponse = httpClient.execute(httpGet);
String res = EntityUtils.toString(httpResponse.getEntity());
} catch (Exception e) {
LOGGER.warn("http client fail", e);
return null;
}