PHP模仿http basic auth的注销功能

时间:2013-08-06 16:44:51

标签: php http authentication basic-authentication

据我所知,登录http没有“真正的解决方案”,因为它是无状态的。但是,我只需要一个解决方法。我想要实现的是当点击注销链接时,它会重定向到logout.php文件。该文件再次调用基本的auth标头。我想让php代码传入一个伪造的密码,然后重定向到我的主页,用户将“登出”。

我意识到他们实际上不会被注销,而是浏览器将尝试使用最新的auth凭证,这些凭证将被传入并且不正确,因此使用户重新登录有效的凭证。

我基本上没有PHP经验,也无法弄清楚如何编写传递虚假密码的代码。

感谢任何帮助。

logout.php

<?php
    session_start();
    session_write_close();

    header('HTTP/1.1 401 Access Denied');
    header('WWW-Authenticate: Basic realm="HTTPS File Upload"');
    header('HTTP/1.0 401 Unauthorized');
    header('Location: http://www.homepage.com') 
?>

4 个答案:

答案 0 :(得分:1)

此页面上的示例#3可能与您正在寻找的内容相近。

http://php.net/manual/en/features.http-auth.php

您可以采用的另一种方法是实现PHP会话。这是一个很好的基本阅读。

http://phpmaster.com/php-sessions/

编辑 - 如果添加PHP会话,则不需要强制使用无效凭据(是的,您可以同时使用两者)。即使您拥有的唯一会话变量是布尔值$ _SESSION [“IsLoggedIn”]。使用所述变量,您可以将其添加到示例#3中的if语句,如下所示,并通过logout.php脚本将其从会话中删除。

if (!isset($_SESSION["IsLoggedIn"]) || !isset($_SERVER['PHP_AUTH_USER']) ||
    ($_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])) {
    authenticate();
} else {
    ...
}

并且不要忘记使用session_start();无论何时使用$ _SESSION变量,都会在页面顶部显示。

答案 1 :(得分:1)

确实有效:

<?php
if (!isset($_SERVER['PHP_AUTH_USER']) or isset($_POST['logout'])) {
    header('WWW-Authenticate: Basic realm="My Realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo '<h1>Access Denied!</h1>';
    exit;
} else {
    if(!($_SERVER['PHP_AUTH_USER']=='admin' and md5($_SERVER['PHP_AUTH_PW'])=='d81edf2e48ddddddddd631e374c5932d'))
    {
        header('HTTP/1.0 401 Unauthorized');
        exit;
    }
    echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
    echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
}
?>


<html>
<head>
</head>
<body>
<form method="POST">
<button name="logout" type="submit">Log Out</button>
</form>

</body>
</html>

答案 2 :(得分:0)

Basic http auth通过为每个请求传递用户名/密码来工作。浏览器通常会存储凭据并在每个请求中传递它们,因此您的解决方案不能是服务器端,您必须找出一种方法来告诉浏览器忘记凭据,如果可能的话。

答案 3 :(得分:0)

将http响应代码设置为:

401

响应标头必须包含:

WWW-Authenticate : Basic

现在,用户在刷新时会被提示登录。

P.S。 Chromium浏览器将提示用户仅从401代码登录,因此我将使用IE进行测试。另外,隐私浏览模式是你的朋友。