2017-07-24 52 views
0

我想實現小API,爲此我必須檢查用戶的API密鑰與基本身份驗證,但由於某些原因,即使最簡單的例子不工作:PHP基本身份驗證不起作用

<?php 

include '../config.inc.php'; 

$user = $_SERVER['PHP_AUTH_USER'];  
$validated = false; 
if($user == $api_key); 
    $validated = true; 
if (!$validated) { 
    header('WWW-Authenticate: Basic realm="API"'); 
    header('HTTP/1.0 401 Unauthorized'); 
    exit ("Not authorized"); 
} 

和我覺得現在的問題是,我'使用mod_rewrite訪問API本身(不同的API模塊包括取決於已經訪問了哪些頁面),那就是:

RewriteEngine On 
RewriteBase /my_admin/api/ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php 

當訪問的index.php我得到這個錯誤:

Notice: Undefined index: PHP_AUTH_USER in C:\xampp\htdocs\my_admin\api\index.php on line 5 

但是,在上面的文件夾,它工作正常。什麼可能導致這個問題,以及如何解決這個問題?謝謝。

+0

這裏有一些錯誤。 1.在第一次調用中,'$ _SERVER ['PHP_AUTH_USER']'永遠不會存在,因爲瀏覽器尚未獲得標題(您在下面設置),並且用戶還沒有填寫任何信息。 2.在發送標題之前,你有'echo $ user'。在發送標題之前您不能輸出任何內容,否則您將收到「標題已發送」。 –

+0

當我將它放到api文件夾上的一個目錄中時,此示例正常工作。即使沒有sendind任何額外的標題。回聲用戶僅用於調試目的。 –

+0

本例無法按預期工作。至少不用這個確切的代碼。 –

回答

2

你的代碼有幾個問題。首先,你需要檢查,如果你確實得到了用戶:

$user = isset($_SERVER['PHP_AUTH_USER']) ? $_SERVER['PHP_AUTH_USER'] : null; 

那麼你的if語句沒有做任何事情,$validated永遠是正確的。要解決此問題,刪除分號:

if($user && $user == $api_key) $validated = true; 

甚至更​​好:

$validated = $user && $user == $api_key 

也不符合isset檢查自變量肯定是設置,只是檢查它的非空的在我上面的改變。

+0

不要忘記,還有'echo $ user';'_before_頭部被髮送。 –

+0

我明白了,但實際上基本認證對話從不出現的問題。 –

+0

@AlexPetrov再次閱讀此答案,具體如下:_「然後,您的if語句不會執行任何操作,$ validate將始終爲true。要解決此問題,請刪除分號:」_。這就是爲什麼auth對話從不出現的原因。 –