В последнее время у меня есть время, чтобы рассмотреть этот вопрос, я думаю, что нашел ответ. Это своего рода ошибка Python urllib2. В urllib2:
class AbstractDigestAuthHandler:
def http_error_auth_reqed(self, auth_header, host, req, headers):
authreq = headers.get(auth_header, None)
if self.retried > 5:
# Don't fail endlessly - if we failed once, we'll probably
# fail a second time. Hm. Unless the Password Manager is
# prompting for the information. Crap. This isn't great
# but it's better than the current 'repeat until recursion
# depth exceeded' approach <wink>
raise HTTPError(req.get_full_url(), 401, "digest auth failed",
headers, None)
else:
self.retried += 1
if authreq:
scheme = authreq.split()[0]
if scheme.lower() == 'digest':
return self.retry_http_digest_auth(req, authreq)
Здесь authreq:
Basic realm="rets@tra.rets.interealty.com", Digest realm="rets@tra.rets.interealty.com",nonce="512f616ed13813817feddb4fb0ce9e2d",opaque="84f5e814-d38a-44b4-8239-3f5be6ee3153",qop="auth"
authreq.split () [0] будет "Basic", никогда не будет "digest", поэтому urllib2 не будет выполнять второй запрос в дайджест-аутентификации.
Обычно urllib2 предполагает, что в первом заголовке ответа 401 может быть только одна аутентификация. К сожалению, этот сервер возвращает два типа аутентификации.
Чтобы решить эту проблему, вы можете использовать обычную аутентификацию или другую библиотеку, например «запросы».