最近查看公司的CodeBase,看到有這樣的一行:
if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']))
其中的 PHP_AUTH_USER
和 PHP_AUTH_PW
不知道是什么東西,網上查了一下,發現挺有意思的,現在記錄總結一下。
要獲取 $_SERVER['PHP_AUTH_USER']
和 $_SERVER['PHP_AUTH_PW']
,首先需要使用 PHP 的 header() 函數設置兩個響應頭,如下:
Header('WWW-Authenticate: Basic realm="USER LOGIN"');
Header('HTTP/1.0 401 Unauthorized');
設置了這兩個響應頭,網頁在載入前就會出現一個登錄框,要求輸入用戶名和密碼。
為了獲取從這個登錄框中傳來的用戶名和密碼,需要用到 PHP 提供的兩個特殊變量 $_SERVER['PHP_AUTH_USER']
和 $_SERVER['PHP_AUTH_PW']
。
通過這兩個變量拿到用戶輸入的用戶名和密碼,就可以做進一步的操作。比如下面這個小小的Demo:
<?php
if ( !isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) ) {
header('WWW-Authenticate: Basic realm="USER LOGIN"');
header('HTTP/1.0 401 Unauthorized');
echo 'Please input username and password.';
exit;
} else {
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
}
用這種方式實現的登錄驗證,目前發現如下缺點:
- 關閉瀏覽器窗口,登錄就會斷開,重新打開就要重新登錄
- 無法在網頁中實現點擊一個按鈕來退出登錄
- 跟
cookie
和session
的那種方式對比,這種方式只能獲取到用戶的賬號和密碼,無法在服務端保存用戶相關的其他數據
如果發現文章中有不對的地方,歡迎在評論區指出。