2009-06-10 115 views
3

我想在PHP脚本中使用HTTP摘要授权对另一个站点进行身份验证。HTTP摘要在PHP中进行身份验证

我的函数作为参数WWW身份验证头的只是内容和我要生成正确的响应(授权头)。我发现很多例子解释了如何以另一种方式实现这一点(浏览器验证我的脚本),但不是这样。我缺少能够解析WWW-Authenticate头部内容的函数,生成响应。是否有一些标准函数或公共库实现了这一点?

+0

你用什么来连接到网站?卷曲? – 2009-06-10 12:42:09

+0

我是使用xmlrpc库的连接。我通过调用远程对象的一个​​特定函数来接收WWW-Authenticate,并且必须将标准响应传递给另一个函数。 – Jiri 2009-06-10 12:46:42

+0

您可以尝试我的RESTful客户端。对于使用CI GET类型支持的PHP来说,这是基本但容易的客户端。 url:https://github.com/corysus/restful_client – corysus 2012-11-06 12:47:14

回答

7

好吧,没有答案,我已经调查了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"); 
1

不知道现成的客户端在PHP中的实现;您必须实施the RFC,就好像您的脚本是浏览器,并向远程服务器进行身份验证。 Wikipedia's page on HTTP Digest has a nice example

(这并不难 - 一对夫妇的MD5哈希一些陷阱构建服务器端的时候我encontered:字符串分隔符是“”(冒号),请求方法也是哈希的一部分。)