Autenticación HTTP Digest en PHP

Deseo autenticar a otro sitio usando la autorización HTTP Digest en el script PHP.

Mi función tiene como parámetro solo el contenido del encabezado WWW-Authenticate y quiero generar una respuesta correcta (encabezado de autorización ). He encontrado muchos ejemplos que explican cómo implementar esto de otra manera (autenticación de navegador en mi script) pero no de esta manera. Me falta la función que es capaz de analizar WWW-Authenticate header content una respuesta de generación. ¿Hay alguna función estándar o biblioteca común que implemente esto?

Ok, todavía no hay respuesta. Investigué la implementación de Python que mintió por aquí y la reescribí en PHP. Es la pieza de código más simple posible. Admite sólo el hashing md5 , pero funciona para mí:

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

Uso:

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

No sé de una implementación de cliente lista en PHP; tiene que implementar el RFC como si su script fuera el navegador, autenticándose en un servidor remoto. La página de Wikipedia en HTTP Digest tiene un buen ejemplo .

(no es tan difícil – un par de hashes MD5. Algunos errores que encontré al construir el lado del servidor: el delimitador de cadena es ” : ” (dos puntos), el método de solicitud también es parte del hash)