Обычная http-аутентификация от браузера к серверу через сокет

1

Я пытаюсь написать простой Java-сервер, который получает HTTP-запросы GET из веб-браузера и отправляет обратно некоторые данные. Вся связь осуществляется через сокеты.

Я могу обрабатывать запросы, и теперь я пытаюсь реализовать простую аутентификацию с BASIC AUTH, поэтому некоторые запросы будут обрабатываться только в том случае, если в заголовке запроса указаны правильные учетные данные. Для простоты я использую только протокол http (не https). Я не уверен, как получить доступ к заголовку и прочитать учетные данные на моем сервере:

Сервер работает на localhost, порт 9000, и это пример URL-адреса, который я пытаюсь обработать:

http://user:password@localhost:9000/files/text?tid=file3

Я открываю сокет и читаю все:

InputStream input = clientSocket.getInputStream();

// Reading line by line with a BufferedReader
java.io.BufferedReader in = new java.io.BufferedReader(new String line;
while (!(line = in.readLine()).equals("")) {
    System.out.println(line);
}

Это то, что я получаю:

GET /files/text?tid=file3 HTTP/1.1
Host: localhost:9000
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/41.0.2272.76 Chrome/41.0.2272.76 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8

В URL-адресе нет следов учетных данных, которые я установил, поэтому я не уверен, как разбирать запрос. Не могли бы вы рассказать мне, что мне здесь не хватает?

Я знаю, что этот пример очень прост, и есть более умные способы его реализации, но мне любопытно, как получить доступ к этим учетным данным в этом простом случае модели.

  • 1
    Вы пишете «Нет никаких следов учетных данных, которые я ввел в URL». Это не так, как работает Basic Auth. Клиент должен установить заголовок Authorization .
  • 0
    Я думал, что заголовок устанавливается в основном путем добавления учетных данных в URL: user: password @rest_of_the_url rest_of_the_url
Показать ещё 2 комментария
Теги:
sockets
http

1 ответ

1
Лучший ответ

Используйте клиент, например, curl:

$ curl -v -u user:password "http://localhost:9000/files/text?tid=file3"

Поскольку HTTP не имеет состояния, достаточно отправить заголовок Authentication. Это то, что делает curl. Нет необходимости ждать, пока сервер вернет 401.

  • 0
    Тот с локон работает. Есть ли способ заставить его работать и с браузером?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню