PHP使用表单实现HTTP基本身份验证

4

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

我听说Internet Explorer不再支持使用http://user:password@website.com,所以我不知道最好的方法是什么。

使用PHP、JavaScript和HTML是可以的。我不想使用PERL,也不想使用大型JavaScript库。

如果您认为HTTP基本认证不是最好的方法,请推荐一些易于操作且简单的方法。这只是一个5-6人的登录网站,没有必要使它变得复杂。


1
有必要使用HTML表单吗?除非您使用类似于http://user:password@website.com的技巧,否则HTTP基本身份验证将导致浏览器显示标准弹出框,要求输入用户名和密码。这样做是否可以代替HTML表单? - David
我希望他们能看到一个HTML表单...提交它...然后使用HTML基本身份验证登录...我根本不想让那个弹出框显示出来。 - ParoX
登录5-6个人,太过注重美观了。 - Your Common Sense
是的,可以将HTTP身份验证与表单结合使用。使用jQuery或XMLHttpRequest参数,就像jcubic所示。这种方法的困难之处在于触发注销。这就是为什么每个人都推荐老式登录表单的原因。 - mario
4个回答

3

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

$('#submit').click(function() {
   $.ajax({
      url: 'authenticated.php',
      username: $('#login').val(),
      password: $('#passwd').val(),
      success: function(data) {
         //从服务器返回的数据做一些处理
      }
   });
   return false;
});

2
在我看来,使用HTTP身份验证的整个意义在于能够委托身份验证任务:
1. Web服务器负责拒绝未经授权的访问受保护的资源 2. 浏览器负责在需要时请求用户名和密码
因此,您只需付出最少的努力就可以拥有一个可用的系统。
现在,如果您使用HTML表单来请求凭据,则服务器将知道您是谁,但浏览器不会:它会在找到WWW-Authenticate响应标头和401状态代码时立即请求凭据。为了使其工作,浏览器必须在每个HTTP请求上发送Authorization请求标头; 但是,您的表单无法指示浏览器发送适当的HTTP标头。
当然,您可以编写自己的PHP服务器端身份验证代码,将服务器配置为通过它解析静态文件,并在获取有效凭据后省略401和WWW-Authenticate(然后需要将其存储在其他位置,例如PHP会话中)。但是,这时您已经失去了HTTP身份验证的所有优势:此时,具有PHP会话的自定义登录处理程序将是更简单的解决方案。
总之:
1. 如果您需要简单性,请忘记HTML表单。 2. 如果您需要HTML表单,请编写自己的代码。

0

感谢您的建议;我已经做好了设置。目前他们使用那个丑陋的弹出框登录。我更喜欢有样式的表单,并将其传递到网站上。 - ParoX

-1
如何使用 HTTP 基本身份验证,并让用户在 HTML 表单中提交他们的用户名和密码?
没有办法。
请推荐一些简单易行的方法。
会话、cookie。可以搜索 PHP 认证教程,有超过 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';


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接