Python中使用套接字实现HTTP基本认证

5 投票
2 回答
10575 浏览
提问于 2025-04-15 23:17

如何通过套接字在Python中使用基本的HTTP认证连接到服务器。我不想使用urllib或urllib2等库,因为我的程序需要进行一些低级的套接字输入输出操作。

2 个回答

2

比如看看urllib的源代码,特别是里面的http_error_401函数(还有它周围的调度部分):首先发起一个HTTP请求,然后注意是否收到401的响应,接着提取出它的领域(realm),检查它的协议是否是basic,然后再用这个领域的用户名和密码重试一次(可以参考同一个源文件里的retry_http_basic_auth函数)。当然,这里面的工作量很大,但这就是你想要的“深入底层编程”的代价。

5

最简单的入门方式可能就是使用 makefile(),这样可以让你以更简单的文件方式来操作网络连接。

import socket, base64

host= 'www.example.com'
path= '/'
username= 'fred'
password= 'bloggs'
token= base64.encodestring('%s:%s' % (username, password)).strip()

lines= [
    'GET %s HTTP/1.1' % path,
    'Host: %s' % host,
    'Authorization: Basic %s' % token,
    'Connection: close',
]

s= socket.socket()
s.connect((host, 80))
f= s.makefile('rwb', bufsize=0)
f.write('\r\n'.join(lines)+'\r\n\r\n')
response= f.read()
f.close()
s.close()

不过,如果你想要从返回的响应中提取出HTML内容或者需要身份验证的头信息,还得做很多额外的工作。同时,你还要处理重定向、错误、传输编码等等,这些都需要正确处理。HTTP协议其实是挺复杂的!你确定真的需要使用底层的网络连接吗?

撰写回答