6

有没有一种方法可以注销在php中完成的摘要验证。我试过未设置($ _ SERVER [“PHP_AUTH_DIGEST”]); 但它不会要求重新登录。 我知道如果我关闭浏览器,那么它会工作,这里是我的功能。PHP摘要验证,注销

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; 
    } 

我还需要添加到注销功能来完成此功能。

如果我改变它的领域,但我不希望它被改变。

+0

重复[通过PHP HTTP身份验证注销](http://stackoverflow.com/questions/449788/http-authentication-logout-via-php)。答案:No. – netcoder 2011-01-05 04:54:34

+0

我知道这可以做,只是不知道如何。 – 2011-01-05 04:58:48

+0

关闭浏览器是唯一的方法,因为信息在浏览器内部注册 – ajreal 2011-01-05 05:05:04

回答

10

取消设置$ _SERVER ['PHP_AUTH_DIGEST']将不起作用。问题是,对于你设定的任务来说,并没有真正的“好”答案。

HTTP规范在技术上并没有允许它,但实际上,如果你再给它们发送401,那么大多数浏览器将会有效地“注销用户”。per php.net/http-auth:

Netscape Navigator和Internet Explorer都会在收到服务器响应401时清除本地浏览器窗口的身份验证缓存。这可以有效地“注销”用户,迫使他们重新输入用户名和密码。有些人使用它来“超时”登录,或提供“注销”按钮。

从您的代码,最简单的方法大概是这样的:

function logout(){ 
    header('HTTP/1.1 401 Unauthorized'); 
    return true; 
} 

但同样,这不是实际的HTTP规范批准的东西。

+0

它可以工作,但注销页面要求登录。并且无法通过它登录。事实上,我根本无法登录。哦,它记录我出来好吗只是不能再次登录。它也必须只给头(“HTTP/1.1 401 Unauthorized”);再次没有www认证。 – 2011-01-05 05:10:40

+0

很高兴知道,我不确定Digest是否需要 - 我还没有在我自己的任何东西中实施Digest。 – TML 2011-01-05 05:19:02

+0

我发现像下面这样的东西对我来说很好:http:// codepad。组织/ BUJvSmnm 需要注意的是,在我的情况,我发现至少有一个浏览器(Firefox 3.6),这并要求注销()WWW身份验证头,所以我坚持了在$ _SESSION使用产生uniqid()在注销标题中。 – TML 2011-01-05 05:34:04

6

权威回答:http://tools.ietf.org/id/draft-ietf-httpbis-p7-auth-12.txt - 第6.1节
没有可靠的办法。

一些解决方法包括伪造401和更改realm =,或者用有目的无效的凭据确认AJAX身份验证请求。

+0

可能值得注意的是,本IETF草案文档的相关部分是6.1:身份验证凭证和空闲客户端 – TML 2011-01-05 05:07:53

+0

php代码请吗? – 2011-01-05 05:07:59

+0

@JamesM:你需要通过jQuery启动它,以不显示登录对话框。请求一个单独的'logout1.php',例如发送'header(“Status:401 Logout”)'和'header(“WWW-Authenticate:Invalidate,Basic realm = logout”)''。可选地,第二个带有无效凭证的AJAX调用“logout2.php”,它在不检查的情况下确认它。 – mario 2011-01-05 05:16:37