Отправка базовой аутентификационной информации через форму - PullRequest
15 голосов
/ 16 декабря 2010

Я работаю над сайтом, который в настоящее время использует систему входа в систему с помощью диалогового окна базовой аутентификации, это тип диалога, который вы получите, если перейдете сюда: http://www.dur.ac.uk/vm.boatclub/password/index.php Я не настраивал эту систему и не могу легко / быстро обойти ее, но она работает. Проблема, однако, заключается в том, что диалоговое окно не очень помогает сообщить вам, какую регистрационную информацию вы должны использовать (то есть, какую комбинацию имени пользователя и пароля), и поэтому я хотел бы заменить ее формой. Я думал, что это невозможно, но я хотел спросить, чтобы узнать.

Можно ли настроить форму HTML, которая отправляет данные на сервер так, чтобы он принимал их так же, как при использовании этого диалогового окна? В качестве альтернативы возможно ли настроить PHP-скрипт, который будет принимать обычные данные формы и обрабатывать их, передавая их серверу, чтобы он входил в систему?

Редактировать: После того, как мне сказали, что это обычная аутентификация, я обошел вокруг и сумел найти способ, который работает и поддерживает постоянный вход пользователя в систему. Однако это не работает в Internet Explorer. Решение было просто перенаправить пользователя на: http://username:password@www.dur.ac.uk/vm.boatclub/password/index.php Но Internet Explorer удалил его из-за использования фишинга около 3 лет назад. Есть ли способ использовать javascript, чтобы браузер получил доступ к сайту таким образом? Или мне придется просто изменить свой интерфейс?

Ответы [ 2 ]

11 голосов
/ 23 декабря 2010

После долгих исследований я нашел способ, который работает как в Chrome, так и в IE, и это все, что я тестировал, но логика кода не предполагает, что он должен где-то сломаться. Основан на этой статье:

http://www.peej.co.uk/articles/http-auth-with-html-forms.html

Что довольно глубоко, но суть в том, что при отправке формы вы делаете запрос AJAX в базовую аутентифицированную папку. Запросы AJAX могут принимать информацию об имени пользователя и пароле для базовой аутентификации, и как только браузер авторизуется, как только он авторизуется в этой области, то есть он останется в системе. Предыдущая статья делает это в чистом javascript, так что добавьте что-то кроме простого объяснения ссылка вот (надеюсь, довольно прозрачная) реализация с использованием jQuery:

  $(document).ready(function()
  {
    $('#loginForm').submit(function()
    {
      var username = $('#usernameInput').val();
      var password = $('#passwordInput').val();

      $.ajax(
        {
          'password' : password,
          'username' : username,
          'url'      : 'http://www.website.com/basic-auth-file.php',
          'type'     : 'GET',
          'success'  : function(){ window.location = 'http://www.website.com/basic-auth-file.php'; },
          'error'    : function(){ alert('Bad Login Details');},
        }
      );

      return false;
    });
  });

Это достигло того, чего я хотел, и относительно просто для понимания, однако я бы умолял любого, кто хотел, чтобы это вышло, и не знал об основах аутентификации, чтобы выйти и провести исследование!

8 голосов
/ 16 декабря 2010

Вы можете заменить его формой. http://www.dur.ac.uk/vm.boatclub/password/index.php использует базовую аутентификацию доступа .

базовая аутентификация доступа

Что вы можете сделать, это выполнить базовую аутентификацию с помощью curl

<?php 
// HTTP authentication 
$url = "http://www.dur.ac.uk/vm.boatclub/password/index.php"; 
$ch = curl_init();     
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
curl_setopt($ch, CURLOPT_URL, $url);  
curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword");  
$result = curl_exec($ch);  
curl_close($ch);  
//echo $result; 
?> 

Вариант 1

Прокси все просто повторяется $result

Вариант 2

Считать заголовки из $result, а если код состояния! = 200, то введена неверная информация для входа Пользователь должен снова ввести форму. Если код состояния == 200 были введены правильные учетные данные, и вам нужно выполнить базовую аутентификацию http, отправив заголовки.

header("Authorization: Basic " . base64_encode($username . ":" . $password);

Вы не должны выводить какие-либо данные ($ result) перед отправкой заголовка, иначе вы получите ошибку

Некоторые быстрые ссылки:

...