HTTP Digest аутентификация в PHP - PullRequest
3 голосов
/ 10 июня 2009

Я хочу пройти аутентификацию на другом сайте, используя авторизацию дайджеста HTTP в скрипте PHP.

Моя функция имеет в качестве параметра только содержимое заголовка WWW-Authenticate , и я хочу создать правильный ответ ( Авторизация заголовок). Я нашел много примеров, которые объясняют, как реализовать это другим способом (проверка подлинности браузера для моего сценария), но не так. Мне не хватает функции, которая может анализировать содержимое заголовка WWW-Authenticate и генерировать ответ. Есть ли какая-то стандартная функция или общая библиотека, которая реализует это?

Ответы [ 2 ]

7 голосов
/ 10 июня 2009

Хорошо, пока нет ответа, я исследовал реализацию 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 голос
/ 10 июня 2009

Не знаю о готовой клиентской реализации в PHP; Вы должны реализовать RFC , как если бы ваш скрипт был браузером, аутентифицирующимся на удаленном сервере. На странице Википедии в HTTP Digest есть хороший пример .

(это не так сложно - пара хешей MD5. Некоторые ошибки, которые я указывал при создании серверной части: разделитель строк равен ": " (двоеточие), метод запроса также является частью хэш)

...