2009-06-10 113 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:字符串分隔符是「」(冒號),請求方法也是哈希的一部分。)