有没有办法注销在 php.ini 中完成的摘要身份验证?
我尝试过 unset($_SERVER["PHP_AUTH_USER"]);
但它不会要求重新登录。
我知道如果我关闭浏览器,它就会工作,这是我的功能。
function login(){
$realm = "Restricted area";
$users = array("jamesm"=>"");
if (empty($_SERVER["PHP_AUTH_DIGEST"])) {
header("HTTP/1.1 401 Unauthorized");
header("WWW-Authenticate: Digest realm=\"{$realm}\",qop=\"auth\",nonce=\"".uniqid()."\",opaque=\"".md5($realm)."\"");
return false;
}
if (!($data = http_digest_parse($_SERVER["PHP_AUTH_DIGEST"])) || !isset($users[$data["username"]]))
return false;
$A1 = md5($data["username"] . ":{$realm}:{$users[$data["username"]]}");
$A2 = md5($_SERVER["REQUEST_METHOD"].":{$data["uri"]}");
$valid_response = md5("{$A1}:{$data["nonce"]}:{$data["nc"]}:{$data["cnonce"]}:{$data["qop"]}:{$A2}");
if ($data["response"] != $valid_response)
return false;
return true;
}
function logout(){
unset($_SERVER["PHP_AUTH_DIGEST"]);
return true;
}
我还需要在注销功能中添加什么才能完成此操作。
如果我改变领域它可以工作,但我不希望它被改变。
取消设置 $_SERVER['PHP_AUTH_DIGEST'] 将不会产生任何效果。问题是,对于您设定的任务来说,并没有真正的“好”答案。
HTTP 规范在技术上不允许这样做,但实际上,如果您向他们发送另一个 401,大多数浏览器将有效地“注销用户”。根据 php.net/http-auth:
Netscape Navigator 和 Internet Explorer 在收到 401 的服务器响应后都会清除本地浏览器窗口的身份验证缓存。这可以有效地“注销”用户,迫使他们重新输入用户名和密码。有些人用它来“超时”登录,或提供“注销”按钮。
从您的代码来看,最简单的方法可能是这样的:
function logout(){
header('HTTP/1.1 401 Unauthorized');
return true;
}
但是,这实际上并没有得到 HTTP 规范的认可。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)