PHP – HTTP 身份验证


 PHP 的 header() 函数用于向客户端浏览器发送 “Authentication Required” 消息,使其弹出一个 Username/Password 输入窗口。事实上,header() 允许你发送任何原始的 HTTP 头。


 header(string $header, bool $replace = true, int $response_code = 0): void

字符串参数将传递给 header() 函数。例如


 header("HTTP/1.1 404 Not Found");

它用于计算要发送的 HTTP 状态码。

您还可以使用 header() 函数将浏览器重定向到另一个 URL。

用户填写用户名和密码后,将再次调用包含 PHP 脚本的 URL,并将预定义变量 PHP_AUTH_USERPHP_AUTH_PW AUTH_TYPE 分别设置为用户名、密码和身份验证类型。这些预定义变量位于 $_SERVER 数组中。仅支持 “Basic” 和 “Digest” 身份验证方法。


<?php

   /* 重定向浏览器 */
   header("Location: http://www.example.com/"); 

   /* 确保重定向时不会执行下面的代码。 */
   exit;
   
?>

可选的 replace 参数指示标头是应替换以前的类似标头,还是添加相同类型的第二个标头,response_code 参数强制 HTTP 响应代码为指定值。

为了能够强制客户端身份验证,您需要在文档根文件夹中有一个 .htaccess 文件。打开一个新的文本文件,将以下文本放入其中,并使用 .htaccess 作为名称保存它。

 CGIPassAuth On

例子

强制对页面进行客户端身份验证的示例脚本片段如下 -


<?php
   if (!isset($_SERVER['PHP_AUTH_USER'])) {
      header('WWW-Authenticate: Basic realm="My Realm"');
      header('HTTP/1.0 401 Unauthorized');
      echo '用户点击取消按钮';
      exit;
   } else {
      echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
      echo "<p>你输入 {$_SERVER['PHP_AUTH_PW']} 作为密码</p>";
   }
?>

输出

当您在浏览器中访问脚本时,它会弹出一个对话框,如下所示 -

PHP HTTP Authentication 1

单击登录按钮后,可能会有一个后端脚本来验证登录凭据。通过身份验证后,将使用键 PHP_AUTH_USER PHP_AUTH_PW 创建两个服务器变量,这可以通过 phpinfo() 函数的输出进行验证。

PHP HTTP Authentication 2