Custom Digest Authentication - PullRequest
       13

Custom Digest Authentication

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

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

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

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

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

1 Ответ

1 голос
/ 01 июля 2011

Я использую базовую 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
}
...