當某個頁面需要認證才能進行訪問時,接到請求后服務器端會在響應頭中發送一個 WWW-Authenticate 首部(用來標識認證安全域),語法為
WWW-Authenticate:Basic relam=quoted-string
客戶端接收到后會彈出一個對話框,要求輸入用戶名和密碼,用戶輸入的用戶名和密碼將會分別保存至 $_SERVER['PHP_AUTH_USER'] 和 $_SERVER['PHP_AUTH_PW'] 中,開發者可以設計程序驗證用戶輸入的用戶名和密碼是否正確。
當用戶輸入用戶名和密碼並且點擊確定后,請求頭會發送一個 Authorization 首部,語法為 Authorization:Basic Base64(username:password)
在 IE 下,輸入錯誤超過3次,服務器端會在響應頭中發送 401 狀態碼,提示需要授權(401 (Authorization Required)),在 Chrome 或 FireFox 下,只有用戶選擇取消輸入時,才會發送 401 狀態碼,否則對話框會一直要求輸入用戶名和密碼。
代碼:
1 <?php 2 3 header("Content-type: text/html; charset=utf-8"); 4 5 function validate($user, $pass) { 6 $users = ['dee'=>'123456', 'admin'=>'admin']; 7 if(isset($users[$user]) && $users[$user] === $pass) { 8 return true; 9 } else { 10 return false; 11 } 12 } 13 14 if(!validate(@$_SERVER['PHP_AUTH_USER'], @$_SERVER['PHP_AUTH_PW'])) { 15 http_response_code(401); 16 header('WWW-Authenticate:Basic realm="My website"'); //對話框顯示 http://127.0.0.3 請求用戶名和密碼。信息為:My website 17 echo '需要用戶名和密碼才能繼續訪問'; //取消時瀏覽器輸出 18 exit; 19 } else { 20 var_dump($_SERVER['PHP_AUTH_USER']); 21 var_dump($_SERVER['PHP_AUTH_PW']); 22 }
訪問頁面時,彈出認證窗口:

選擇取消時:

輸出正確的用戶名和密碼時:

參考:《PHP Cookbook,3rd》P244
