Пользовательская дайджест-аутентификация

  • Я сделал Http-модуль для дайджест-аутентификации. На сервере при каждом запросе страницы этот модуль проверяет наличие заголовка «authenticate». Если этот заголовок не существует, пользователь получит сообщение 401.
  • На стороне клиента я использую плагин jQuery для дайджест-аутентификации.

Для знаю, что у меня есть текущая функциональность:

  1. Пользователь вводит имя пользователя и пароль в два поля ввода (не в строке HTTP-аутентификации браузера)
  2. С jQuery я делаю вызов ajax на какую-то защищенную страницу на сервере. Этот вызов ajax основан на протоколе Digest Http. Это означает, что я добавляю заголовок аутентификации с именем пользователя, noncecount, clientnonce, хешированным паролем MD5 и т. д.
  3. Затем ответ сервера с сообщением 200 :)

Если пользователь перейдет на другую страницу, он получит «401 доступ запрещен», потому что в этом запросе нет заголовка аутентификации. И в этом проблема.

  • Если я использую стандартный протокол дайджеста, то браузер автоматически добавляет заголовок авторизации в каждый запрос, и у меня нет этой проблемы. Но я использую этот способ, потому что мне не нужно, чтобы пользователь заполнил свои учетные данные в диалоговом окне HTTP-аутентификации браузера. Мы хотим иметь свой собственный диалог. В плагине jQuery DigestJ заголовок называется «аутентификация» вместо «авторизация», а протокол называется DigestJ вместо Digest. Таким образом, я не получаю диалог браузера Http для ввода учетных данных, когда сервер отвечает сообщением 401. Мы не можем использовать проверку подлинности с помощью формы.
  • Я могу хранить учетные данные пользователя на стороне клиента с помощью плагина сеанса jQuery, но как изменить заголовки Http для каждого запроса? Мне нужно добавить заголовок «аутентификация» и вставить учетные данные из сеанса.

person Vlado    schedule 18.03.2011    source источник
comment
Вы когда-нибудь находили хороший способ сделать это? Я смотрю на аналогичную проблему?   -  person BillMan    schedule 17.05.2011


Ответы (1)


Я использую базовую HTTP-аутентификацию для использования веб-служб REST из компонента joomla, и моим пользователям не нужно ничего вводить (в joomla нужно только один раз войти в систему). Я просто хватаю пользователя, уже вошедшего в систему, а затем отправляю его на свой веб-сервис с помощью CURL.

    $ch = curl_init();
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//$username and $pass are the vars that will be used for authentication you can get them from your session or a cookie or in my case i got them from joomla JFactory::getUser()->username and JFactory::getUser()->password
        curl_setopt($ch, CURLOPT_USERPWD, JFactory::getUser()->username.':'.JFactory::getUser()->password);
    //here comes the important thing
        curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $response=curl_exec($ch);

С другой стороны, вам просто нужно проверить $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW'] в своей базе данных, и все готово.

if (!isset($_SERVER['PHP_AUTH_USER'])||$_SERVER['PHP_AUTH_USER']==''||!isset($_SERVER['PHP_AUTH_PW'])||$_SERVER['PHP_AUTH_PW']=='') {
    header('WWW-Authenticate: Basic realm="Something"');
    header('HTTP/1.0 401 Unauthorized');
   echo 'You must be a valid user to access this contents';
   exit;
} else {
       // go to your database check they are valid and return whatever you want to return
}
person Jorge Bautista    schedule 30.06.2011