PHP中的HTTP摘要认证
我想在PHP脚本中使用HTTP摘要授权对另一个站点进行身份验证PHP中的HTTP摘要认证,php,http,authentication,Php,Http,Authentication,我想在PHP脚本中使用HTTP摘要授权对另一个站点进行身份验证 我的函数只有WWW Authenticate头的内容作为参数,我希望生成正确的响应(authentication头)。我已经找到了许多例子来解释如何以另一种方式(浏览器对我的脚本进行身份验证)实现这一点,但不是以这种方式。我缺少能够解析WWW身份验证头内容并生成响应的函数。是否有一些标准函数或公共库实现了这一点?不知道PHP中有现成的客户端实现;您必须像浏览器一样实现脚本,并向远程服务器进行身份验证 (这没那么难-几个MD5散列。我
我的函数只有WWW Authenticate头的内容作为参数,我希望生成正确的响应(authentication头)。我已经找到了许多例子来解释如何以另一种方式(浏览器对我的脚本进行身份验证)实现这一点,但不是以这种方式。我缺少能够解析WWW身份验证头内容并生成响应的函数。是否有一些标准函数或公共库实现了这一点?不知道PHP中有现成的客户端实现;您必须像浏览器一样实现脚本,并向远程服务器进行身份验证
(这没那么难-几个MD5散列。我在构建服务器端时遇到了一些问题:字符串分隔符是“:”(冒号),请求方法也是散列的一部分)好的,还没有答案,我已经研究了这里的python实现,并将其重写为PHP。这是最简单的代码。仅支持md5哈希,但适用于我:
function H($param) {
return md5($param);
}
function KD($a,$b) {
return H("$a:$b");
}
function parseHttpDigest($digest) {
$data = array();
$parts = explode(", ", $digest);
foreach ($parts as $element) {
$bits = explode("=", $element);
$data[$bits[0]] = str_replace('"','', $bits[1]);
}
return $data;
}
function response($wwwauth, $user, $pass, $httpmethod, $uri) {
list($dummy_digest, $value) = split(' ', $wwwauth, 2);
$x = parseHttpDigest($value);
$realm = $x['realm'];
$A1 = $user.":".$realm.":".$pass;
$A2 = $httpmethod.":".$uri;
if ($x['qop'] == 'auth') {
$cnonce = time();
$ncvalue = 1;
$noncebit = $x['nonce'].":".$ncvalue.":".$cnonce.":auth:".H($A2);
$respdig = KD(H($A1), $noncebit);
}else {
# FIX: handle error here
}
$base = 'Digest username="'.$user.'", realm="';
$base .= $x['realm'].'", nonce="'.$x['nonce'].'",';
$base .= ' uri="'.$uri.'", cnonce="'.$cnonce;
$base .= '", nc="'.$ncvalue.'", response="'.$respdig.'", qop="auth"';
return $base;
}
用法:
# TEST
$www_header = 'Digest realm="TEST", nonce="356f2dbb8ce08174009d53c6f02c401f", algorithm="MD5", qop="auth"';
print response($www_header, "user", "password", "POST", "/my_url_query");
您使用什么连接到站点?cURL?我正在使用xmlrpc库进行连接。我通过调用远程对象的一个特定函数来接收WWW身份验证,我必须将标准响应传递给另一个函数。您可以尝试我的RESTful客户端。这是一个基本但简单的PHP客户端,支持CI GET类型。url:我知道HTTP摘要是如何工作的。更好的方法是阅读RFC2617(),它的描述比维基百科更好,但我正在寻找一些已经实现的函数/库来处理这些问题。@Jiri:你说得对,应该找到源代码。让我们看看是否出现了什么情况——一个摘要库对我也会有用。做得很好。您能否给出一个如何检索www认证头的指针,即nonce?谢谢我必须搜索一下,所以:可以通过get_头($url)检索www-authenticate头(即nonce)