PHP Digest Auth,注销
-
25-09-2019 - |
题
有没有办法记录PHP中完成的消化身份验证。
我尝试了Unsot($ _ server [“ php_auth_digest”]);但这不会要求重新胶质。我知道如果我关闭浏览器,它将起作用,这是我的功能。
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个401。
Netscape Navigator和Internet Explorer都将在接收到401的服务器响应后清除本地浏览器窗口的身份验证缓存。这可以有效地“注销”用户,强迫他们重新输入其用户名和密码。有些人使用它来“超时”登录,或提供“注销”按钮。
从您的代码中,最简单的方法可能是:
function logout(){
header('HTTP/1.1 401 Unauthorized');
return true;
}
但是,同样,这实际上并不是HTTP规范批准的东西。
其他提示
权威答案: http://tools.ietf.org/id/draft-ietf-httpbis-p7-auth-12.txt - 第6.1节
没有可靠的方法。
一些解决方法包括伪造401并更改领域=,或确认具有无效凭据无效的Ajax auth请求。
不隶属于 StackOverflow