2017-07-24 67 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对话从不出现的原因。 –