【问题标题】:PHP HTTP Basic Auth using Form使用表单的 PHP HTTP 基本身份验证
【发布时间】:2011-03-29 08:39:29
【问题描述】:

如何使用 HTTP 基本身份验证并让用户以 HTML 表单提交其用户名和密码,并使用 HTTP 基本身份验证对其进行身份验证。

我听说 Internet Explorer 不再支持使用 http://user:password@website.com,所以我不知道解决这个问题的最佳方法。

可以使用 PHP 和 javascript 和 HTML。我不想使用 PERL,而且我不喜欢大的 javascript 库。

如果您不认为 HTTP 基本身份验证。是最好的方法,请推荐一些简单易行的方法。它只会是 5-6 人的登录站点。无需复杂化。

【问题讨论】:

  • 它必须采用 HTML 表单是否有原因?除非您使用诸如http://user:password@website.com 之类的技巧,否则 HTTP 基本身份验证将导致浏览器显示一个标准的弹出框,要求您输入用户名和密码。那可以代替 HTML 表单吗?
  • 我希望他们看到一个 HTML 表单...提交它...然后让他们使用 HTML 基本身份验证登录...我根本不想显示那个弹出框。
  • 5-6人登录太美了。
  • 是的,可以将 HTTP Auth 与表单结合使用。使用 jQuery 或 XMLHttpRequest 参数作为 jcubic 显示。该方法的困难部分是触发注销。这就是为什么每个人都推荐老式登录表单的原因。

标签: php http authentication


【解决方案1】:

jQuery 库具有 ajax 函数,其中包含用于身份验证的“密码”和“用户”参数。当用户单击登录时,您可以获得登录名和密码的值并传递给 $.ajax 函数。

$('#submit').click(function() { $.ajax({ url: 'authenticated.php', 用户名:$('#login').val(), 密码:$('#passwd').val(), 成功:函数(数据){ //对来自服务器的数据做一些事情 } }); 返回假; });

【讨论】:

    【解决方案2】:

    恕我直言,使用 HTTP 身份验证的全部意义在于能够委派身份验证任务:

    1. Web 服务器负责拒绝对受保护资源的未经授权的访问
    2. 浏览器会在需要时询问用户名和密码

    所以你有一个工作量最小的系统。

    现在,如果您使用 HTML 表单请求凭据,服务器会知道您是谁,但浏览器不会:它会在找到 WWW-Authenticate 响应标头和 @ 987654322@ 状态码。为此,浏览器必须在每个 HTTP 请求上发送Authorization 请求标头;但是,您的表单无法指示浏览器发送适当的 HTTP 标头。

    当然,您可以在 PHP 中编写自己的服务器端身份验证代码,配置服务器以通过它解析静态文件,并在获得有效凭据后立即省略 401WWW-Authenticate(然后需要存储在其他地方,例如 PHP 会话)。但是,您已经失去了 HTTP 身份验证的所有优点:此时,使用 PHP 会话的自定义登录处理程序将是一个更简单的解决方案。

    总结一下:

    • 如果您需要简单,请忘记 HTML 表单
    • 如果您需要 HTML 表单,请编写您自己的代码

    【讨论】:

      【解决方案3】:

      如果我理解正确,您需要将 .htpasswd 与 .htaccess 一起使用:http://tools.dynamicdrive.com/password/

      【讨论】:

      • 感谢您的建议;我已经做好了设置。目前他们使用那个丑陋的弹出框登录。我宁愿有一个样式化的表单并将其传递给网站
      【解决方案4】:

      如何使用 HTTP 基本身份验证并让用户以 HTML 表单提交其用户名和密码

      没办法。

      请推荐一些简单易做的事情。

      会话、cookies。
      google for PHP auth 教程并获得超过 9000 篇文章

      好吧,其中之一

      <?
      if (isset($_POST['auth_name'])) {
        $name=mysql_real_escape_string($_POST['auth_name']);
        $pass=mysql_real_escape_string($_POST['auth_pass']);
        $query = "SELECT * FROM users WHERE name='$name' AND pass='$pass'";
        $res = mysql_query($query) or trigger_error(mysql_error().$query);
        if ($row = mysql_fetch_assoc($res)) {
          session_start();
          $_SESSION['user_id'] = $row['id'];
          $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
        }
        header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
        exit;
      }
      if (isset($_GET['action']) AND $_GET['action']=="logout") {
        session_start();
        session_destroy();
        header("Location: http://".$_SERVER['HTTP_HOST']."/");
        exit;
      }
      if (isset($_REQUEST[session_name()])) session_start();
      if (isset($_SESSION['user_id']) AND $_SESSION['ip'] == $_SERVER['REMOTE_ADDR']) return;
      else {
      include 'your design here.php';
      ?>
      <form method="POST">
      <input type="text" name="auth_name"><br>
      <input type="password" name="auth_pass"><br>
      <input type="submit"><br>
      </form>
      <? 
      }
      exit;
      ?>
      

      打算放入文件并在脚本顶部称为require '/path/auth.php';

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-11
        • 1970-01-01
        • 1970-01-01
        • 2011-05-08
        • 2021-03-21
        • 2011-11-12
        • 2011-05-05
        相关资源
        最近更新 更多