PHP基本身份验证不';行不通
我正在尝试实现小型API,为此,我必须使用basic auth检查用户的API密钥,但出于某些原因,即使是最简单的示例也不起作用:PHP基本身份验证不';行不通,php,basic-authentication,Php,Basic Authentication,我正在尝试实现小型API,为此,我必须使用basic auth检查用户的API密钥,但出于某些原因,即使是最简单的示例也不起作用: <?php include '../config.inc.php'; $user = $_SERVER['PHP_AUTH_USER']; $validated = false; if( $user == $api_key ); $validated = true; if (!$validated) { header('WWW-Auth
<?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");
}
访问index.php时,我遇到以下错误:
Notice: Undefined index: PHP_AUTH_USER in C:\xampp\htdocs\my_admin\api\index.php on line 5
但是,在上面的文件夹中,它可以正常工作。什么会导致此问题?如何解决此问题?谢谢。您的代码中有一些问题。首先,您需要检查是否确实获得了用户:
$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
,因为变量已明确设置,只需检查它是否为非空,就像我在上面所做的更改一样。您的代码中存在一些问题。首先,您需要检查是否确实获得了用户:
$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
,因为变量是明确设置的,只需检查它是否如我上面的更改中所示为非空。这里有一些错误。1.在第一次调用中,$\u服务器['PHP\u AUTH\u USER']
将永远不存在,因为浏览器尚未获取标题(您在下面设置),用户也未填写任何信息。2.您有echo$user在发送标题之前,请执行代码>操作。在发送标题之前,您不能输出任何内容,否则您将得到“headers ready sent”(标题已发送)。当我将其放在api文件夹上方的目录中时,该示例运行良好。即使没有sendind任何额外的头。Echo用户仅用于调试目的。此示例不可能按预期工作。至少没有这个确切的代码。这里有一些错误。1.在第一次调用中,$\u服务器['PHP\u AUTH\u USER']
将永远不存在,因为浏览器尚未获取标题(您在下面设置),用户也未填写任何信息。2.您有echo$user在发送标题之前,请执行代码>操作。在发送标题之前,您不能输出任何内容,否则您将得到“headers ready sent”(标题已发送)。当我将其放在api文件夹上方的目录中时,该示例运行良好。即使没有sendind任何额外的头。Echo用户仅用于调试目的。此示例不可能按预期工作。至少对于这个精确的代码来说不是这样。别忘了还有一个echo$user
在发送标题之前。我明白了,但问题是“实际基本身份验证”对话框从未出现。@AlexPetrov再次阅读此答案,特别是:“那么您的if语句不起任何作用,$validated将始终为true。若要解决此问题,请删除分号:”。这就是为什么“身份验证”对话框从未出现的原因。@AlexPetrov,试着只放标题('WWW-Authenticate:Basic realm=“API”);标题(“HTTP/1.0 401未经授权”)代码>以确认对话框是否出现。这意味着你只需要修正导致它的逻辑。正如@Magnus提到的,在调用header()
之前,您还需要确保不回显任何内容,不要忘记还有一个echo$user
在发送标题之前。我明白了,但问题是“实际基本身份验证”对话框从未出现。@AlexPetrov再次阅读此答案,特别是:“那么您的if语句不起任何作用,$validated将始终为true。若要解决此问题,请删除分号:”。这就是为什么“身份验证”对话框从未出现的原因。@AlexPetrov,试着只放标题('WWW-Authenticate:Basic realm=“API”);标题(“HTTP/1.0 401未经授权”)代码>以确认对话框是否出现。这意味着你只需要修正导致它的逻辑。正如@Magnus提到的,在调用header()