我想在PHP脚本中使用HTTP摘要授权对另一个站点进行身份验证。HTTP摘要在PHP中进行身份验证
我的函数作为参数WWW身份验证头的只是内容和我要生成正确的响应(授权头)。我发现很多例子解释了如何以另一种方式实现这一点(浏览器验证我的脚本),但不是这样。我缺少能够解析WWW-Authenticate头部内容的函数,生成响应。是否有一些标准函数或公共库实现了这一点?
我想在PHP脚本中使用HTTP摘要授权对另一个站点进行身份验证。HTTP摘要在PHP中进行身份验证
我的函数作为参数WWW身份验证头的只是内容和我要生成正确的响应(授权头)。我发现很多例子解释了如何以另一种方式实现这一点(浏览器验证我的脚本),但不是这样。我缺少能够解析WWW-Authenticate头部内容的函数,生成响应。是否有一些标准函数或公共库实现了这一点?
好吧,没有答案,我已经调查了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");
不知道现成的客户端在PHP中的实现;您必须实施the RFC,就好像您的脚本是浏览器,并向远程服务器进行身份验证。 Wikipedia's page on HTTP Digest has a nice example。
(这并不难 - 一对夫妇的MD5哈希一些陷阱构建服务器端的时候我encontered:字符串分隔符是“:”(冒号),请求方法也是哈希的一部分。)
你用什么来连接到网站?卷曲? – 2009-06-10 12:42:09
我是使用xmlrpc库的连接。我通过调用远程对象的一个特定函数来接收WWW-Authenticate,并且必须将标准响应传递给另一个函数。 – Jiri 2009-06-10 12:46:42
您可以尝试我的RESTful客户端。对于使用CI GET类型支持的PHP来说,这是基本但容易的客户端。 url:https://github.com/corysus/restful_client – corysus 2012-11-06 12:47:14