通过套接字从浏览器到服务器的基本 http 身份验证

Basic http authentication from browser to server via socket

我正在尝试编写一个简单的 java 服务器,它从网络浏览器接收 HTTP GET 请求并发回一些数据。所有通信都是通过套接字完成的。

我能够处理请求,现在我正在尝试使用 BASIC AUTH 实施简单的身份验证,因此只有在请求中提供正确的凭据时才会处理某些请求 header。为了简单起见,我只使用 http 协议(而不是 https)。不过,我不确定如何访问 header 并读取我服务器上的凭据:

服务器在本地主机上运行,​​端口 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 中输入的身份验证凭据没有踪迹,因此我不确定如何解析请求。你能告诉我我在这里错过了什么吗?

我知道这个例子非常简单,还有更聪明的方法来实现它,但我很好奇如何在这个简单的模型案例中访问这些凭据。

使用像 curl 这样的客户端:

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

由于 HTTP 是无状态的,发送 Authentication header 就足够了。这就是 curl 所做的。无需等待服务器 return a 401.