Intereting Posts

HTTP-дайджест, аутентифицирующий в PHP

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

Моя функция имеет в качестве параметра только содержимое заголовка WWW-Authenticate, и я хочу создать правильный ответ (заголовок авторизации ). Я нашел много примеров, объясняющих, как реализовать это другим способом (аутентификация браузера для моего скрипта), но не таким образом. Мне не хватает функции, которая может анализировать содержимое заголовка 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; вам необходимо реализовать RFC, как будто ваш скрипт был браузером, аутентифицируясь на удаленном сервере. Хороший пример – страница Википедии на HTTP-дайджесте .

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