HTTP基本認証がpythonのurllib2で動作しないようです

basic-authentication http-basic-authentication python urllib2
HTTP基本認証がpythonのurllib2で動作しないようです

urllib2を使用して基本認証で保護されたページをダウンロードしようとしています。 私はPython 2.7を使用していますが、Python 2.5を搭載した別のコンピューターでも試してみましたが、まったく同じ動作に遭遇しました。 http://www.voidspace.org.uk/python/articles/authentication.shtml [このガイド]に記載されている例をできるだけ忠実に実行しました。作成したコードは次のとおりです。

import urllib2

passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, "http://authenticationsite.com/', "protected", "password")
authhandler = urllib2.HTTPBasicAuthHandler(passman)
opener = urllib2.build_opener(authhandler)

f = opener.open("http://authenticationsite.com/content.html")
print f.read()
f.close()

残念ながら、サーバーは私のものではないため、詳細を共有することはできません。私はそれらを上下に交換しました。 実行すると、次のトレースバックが表示されます。

  File
"/usr/lib/python2.7/urllib2.py", line
397, in open
response = meth(req, response)   File "/usr/lib/python2.7/urllib2.py",
line 510, in http_response
'http', request, response, code, msg, hdrs)   File
"/usr/lib/python2.7/urllib2.py", line
435, in error
return self._call_chain(*args)   File "/usr/lib/python2.7/urllib2.py",
line 369, in _call_chain
result = func(*args)   File "/usr/lib/python2.7/urllib2.py", line
518, in http_error_default
raise HTTPError(req.get_full_url(), code,
msg, hdrs, fp) urllib2.HTTPError: HTTP
Error 401: Authorization Required

興味深いのは、ngrepを使用してコンピューターのTCPトラフィックを監視するときです。

ngrep host 74.125.224.49 interface:
wlan0 (192.168.1.0/255.255.255.0)
filter: (ip) and ( host 74.125.224.49
)
#### T 192.168.1.74:34366 -74.125.224.49:80 [AP]   GET /content.html
HTTP/1.1..Accept-Encoding:
identity..Host:
authenticationsite.com..Connection:
close..User-Agent:
Python-urllib/2.7....

## T 74.125.224.49:80 -192.168.1.74:34366 [AP]   HTTP/1.1 401 Authorization Required..Date: Sun, 27
Feb 2011 03:39:31 GMT..Server:
Apache/2.2.3 (Red
Hat)..WWW-Authenticate: Digest
realm="protected",
nonce="6NSgTzudBAA=ac585d1f7ae0632c4b90324aff5e39e0f1fc25
05", algorithm=MD5,
qop="auth"..Content-Length:
486..Connection: close..Content-Type: text/html;
charset=iso-8859-1......401 Authorization
Required..Authorization
Required.This server could not
verify that you.are authorized to
access the document.requested.  Either
you supplied the wrong.credentials
(e.g., badpassword), or
your.browser doesn't understand how to
supply.the credentials
required...Apache/2.2.3
(Red Hat) Server at
authenticationsite.com Port
80..

####

urllib2は、最初の401エラーを取得した後でも資格情報を提供しようとせずに、その例外をスローしているように見えます。

比較のために、代わりにWebブラウザーで認証を行う場合のngrepの出力を次に示します。

ngrep host 74.125.224.49 interface:
wlan0 (192.168.1.0/255.255.255.0)
filter: (ip) and ( host 74.125.224.49
)
#### T 192.168.1.74:36102 -74.125.224.49:80 [AP]   GET /content.html HTTP/1.1..Host:
authenticationsite.com..User-Agent:
Mozilla/5.0 (X11; U; Linux i686;
en-US; rv:1.9.2.12) Gecko/20101027
Firefox/3.6.12..Accept: text
/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8..Accept-Language:
en-us,en;q=0.5..Accept-Encoding:
gzip,deflate..Accept-Charset:
ISO-8859-1,utf-8;q=0.7,*;q=0.7..Keep-Alive:
115..Connection: keep-   alive....
## T 74.125.224.49:80 -192.168.1.74:36102 [AP]   HTTP/1.1 401 Authorization Required..Date: Sun, 27
Feb 2011 03:43:42 GMT..Server:
Apache/2.2.3 (Red
Hat)..WWW-Authenticate: Digest
realm="protected",
nonce="rKCfXjudBAA=0c1111321169e30f689520321dbcce37a1876b
be", algorithm=MD5,
qop="auth"..Content-Length:
486..Connection: close..Content-Type: text/html;
charset=iso-8859-1......401 Authorization
Required..Authorization
Required.This server could not
verify that you.are authorized to
access the document.requested.  Either
you supplied the wrong.credentials
(e.g., badpassword), or
your.browser doesn't understand how to
supply.the credentials
required...Apache/2.2.3
(Red Hat) Server at
authenticationsite.com Port
80..

######### T 192.168.1.74:36103 -74.125.224.49:80 [AP]   GET /content.html HTTP/1.1..Host:
authenticationsite.com..User-Agent:
Mozilla/5.0 (X11; U; Linux i686;
en-US; rv:1.9.2.12) Gecko/20101027
Firefox/3.6.12..Accept: text
/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8..Accept-Language:
en-us,en;q=0.5..Accept-Encoding:
gzip,deflate..Accept-Charset:
ISO-8859-1,utf-8;q=0.7,*;q=0.7..Keep-Alive:
115..Connection: keep-   alive..Authorization: Digest
username="protected",
realm="protected",
nonce="rKCfXjudBAA=0c1111199162342689520550dbcce37a1876bbe",
uri="/content.html", algorithm=   MD5,
response="3b65dadaa00e1d6a1892ffff49f9f325",
qop=auth, nc=00000001,
cnonce="7636125b7fde3d1b"....

##

その後、サイトのコンテンツが続きます。

私はこれでしばらく遊んでいましたが、私が間違っていることを理解することができません。 誰かが私を助けてくれたらとても感謝しています!

  9  6


ベストアンサー

私はこれが原因だと思う:

WWW-Authenticate: Digest

リソースは基本ではなくダイジェストで認証されているようです。 つまり、代わりにhttp://docs.python.org/library/urllib2.html#urllib2.HTTPDigestAuthHandler[urllib2.HTTPDigestAuthHandler]を使用する必要があります。

コードは

import urllib2

passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, "http://authenticationsite.com/", "protected", "password")

# use HTTPDigestAuthHandler instead here
authhandler = urllib2.HTTPDigestAuthHandler(passman)
opener = urllib2.build_opener(authhandler)

res = opener.open("http://authenticationsite.com/content.html")
print res.read()
res.close()

9


これにはpython NTLMモジュールを使用する必要があります。

ntlmからインポートするHTTPNtlmAuthHandler

インポートurllib2

user = “Your_username”

パスワード= “your_Passwrd”

passman = urllib2.HTTPPasswordMgrWithDefaultRealm()

passman.add_password(なし、「http:// your_Home_location /」、ユーザー、パスワード)

auth_NTLM = HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(passman)

opener = urllib2.build_opener(auth_NTLM)

urllib2.install_opener(オープナー)

url = “http:// Your_home_location / sub_locations”

応答= urllib2.urlopen(url)

ヘッダー= response.info()

print( “headers:\ {}”。format(headers))

body = response.read()

print( “response:” + body)

0


import urllib2
# Create an OpenerDirector with support for Basic HTTP Authentication...
auth_handler = urllib2.HTTPBasicAuthHandler()
auth_handler.add_password(realm='PDQ Application',
                          uri='https://mahler:8092/site-updates.py',
                          user='klem',
                          passwd='kadidd!ehopper')
opener = urllib2.build_opener(auth_handler)
# ...and install it globally so it can be used with urlopen.
urllib2.install_opener(opener)
urllib2.urlopen('http://www.example.com/login.html')

-1


タイトルとURLをコピーしました