我想在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