HTTP Digest PHP kimlik

2 Cevap php

Ben PHP komut dosyası HTTP Digest yetki kullanarak başka bir siteye kimlik doğrulaması için istiyorum.

Benim işlevi WWW-Authenticate başlığının parametre sadece içerik olarak vardır ve ben doğru yanıt (Authorization başlık) oluşturmak istiyorum. Bu başka bir yol (tarayıcı benim komut dosyası kimlik doğrulaması) ancak bu şekilde uygulamak için nasıl açıklamak birçok örnekler bulduk. Ben WWW-Authenticate başlığı içeriği bir yanıt üretmek ayrıştırmak mümkün fonksiyonu eksik yaşıyorum. Bu uygulayan bazı standart fonksiyon ya da ortak kütüphane var mı?

2 Cevap

Tamam, hayır cevabı henüz, ben buralarda yalan ve PHP için yeniden yazmak python uygulanmasını araştırdık. Bu kod basit olası parçasıdır. Sadece md5 karma destekler, ama benim için çalışıyor:

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;
    }

Kullanımı:

# TEST
$www_header = 'Digest realm="TEST", nonce="356f2dbb8ce08174009d53c6f02c401f", algorithm="MD5", qop="auth"';
print response($www_header, "user", "password", "POST", "/my_url_query");

PHP bir hazır client-side uygulama bilmiyorum; Lütfen komut bir uzak sunucuya kimlik doğrulaması, tarayıcı sanki the RFC uygulamak zorunda. Wikipedia's page on HTTP Digest has a nice example.

(O kadar da zor değil - MD5 bir çift sunucu tarafı oluştururken ben encontered Bazı FRİKİKLERİNDEN sağlamalarının:. Dize sınırlayıcı ":" dir (kolon), istek yöntemi de karma bir parçasıdır)