Python urllib2 基本認証の問題 質問する

Python urllib2 基本認証の問題 質問する

更新: Lee のコメントに基づいて、コードを非常にシンプルなスクリプトに凝縮し、コマンド ラインから実行することにしました。

import urllib2
import sys

username = sys.argv[1]
password = sys.argv[2]
url = sys.argv[3]
print("calling %s with %s:%s\n" % (url, username, password))

passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, url, username, password)
urllib2.install_opener(urllib2.build_opener(urllib2.HTTPBasicAuthHandler(passman)))

req = urllib2.Request(url)
f = urllib2.urlopen(req)
data = f.read()
print(data)

残念ながら、それでもAuthorizationヘッダーは生成されません (Wireshark による) :(

urllib2経由で基本認証を送信する際に問題が発生しています。この記事、例に従いました。私のコード:

passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, "api.foursquare.com", username, password)
urllib2.install_opener(urllib2.build_opener(urllib2.HTTPBasicAuthHandler(passman)))

req = urllib2.Request("http://api.foursquare.com/v1/user")    
f = urllib2.urlopen(req)
data = f.read()

Wireshark 経由で Wi​​re に次の内容が表示されています:

GET /v1/user HTTP/1.1
Host: api.foursquare.com
Connection: close
Accept-Encoding: gzip
User-Agent: Python-urllib/2.5 

curl 経由でリクエストを送信した場合と比較して、認証が送信されていないことがわかります。curl -u user:password http://api.foursquare.com/v1/user

GET /v1/user HTTP/1.1
Authorization: Basic =SNIP=
User-Agent: curl/7.19.4 (universal-apple-darwin10.0) libcurl/7.19.4 OpenSSL/0.9.8k zlib/1.2.3
Host: api.foursquare.com
Accept: */*

何らかの理由で、私のコードは認証を送信しないようです。何が欠けているのか分かる人はいますか?

ありがとう

-サイモン

ベストアンサー1

問題は、Python ライブラリが HTTP 標準に従って最初に認証されていないリクエストを送信し、401 再試行で応答があった場合にのみ正しい認証情報が送信されることにある可能性があります。Foursquare サーバーが「完全に標準的な認証」を行わない場合、ライブラリは機能しません。

ヘッダーを使用して認証を行ってみてください:

import urllib2, base64

request = urllib2.Request("http://api.foursquare.com/v1/user")
base64string = base64.b64encode('%s:%s' % (username, password))
request.add_header("Authorization", "Basic %s" % base64string)   
result = urllib2.urlopen(request)

あなたと同じ問題を抱えていましたが、このスレッドから解決策を見つけました:http://forums.shopify.com/categories/9/posts/27662

おすすめ記事