私はREST APIにアクセスしようとしています。urllib2はプリエンプティブ認証認証をサポートしていますか?
Curl/REST Client(UIツール)でプリエンプティブ認証が有効になっています。
しかし、urllib2を使用すると、これはデフォルトでサポートされていないように見えますが、私はそれを有効にする方法を見つけることができません。
感謝:)あなたが身体を送信する前に
私はREST APIにアクセスしようとしています。urllib2はプリエンプティブ認証認証をサポートしていますか?
Curl/REST Client(UIツール)でプリエンプティブ認証が有効になっています。
しかし、urllib2を使用すると、これはデフォルトでサポートされていないように見えますが、私はそれを有効にする方法を見つけることができません。
感謝:)あなたが身体を送信する前に
urllib2.HTTPBasicAuthHandler
のコードに基づいて、単純なプリエンプティブHTTP基本認証ハンドラを次に示します。まったく同じ方法で使用できますが、一致するURLを指定してリクエストごとにに追加されるのはAuthorization
です。このハンドラはHTTPPasswordMgrWithDefaultRealm
で使用する必要があります。あなたが先制しているので、WWW-Authenticate
チャレンジに戻ってくる領域がないからです。
class PreemptiveBasicAuthHandler(urllib2.BaseHandler):
def __init__(self, password_mgr=None):
if password_mgr is None:
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
self.passwd = password_mgr
self.add_password = self.passwd.add_password
def http_request(self,req):
uri = req.get_full_url()
user, pw = self.passwd.find_user_password(None,uri)
#logging.debug('ADDING REQUEST HEADER for uri (%s): %s:%s',uri,user,pw)
if pw is None: return req
raw = "%s:%s" % (user, pw)
auth = 'Basic %s' % base64.b64encode(raw).strip()
req.add_unredirected_header('Authorization', auth)
return req
ありがとうございました。私は本当にあなたに良い説明とこの質問に答える時間がかかることを感謝します。 – thinkanotherone
必要とされている認証の種類に応じて、あなたはあなたの要求にそれらを追加することによって、手動で認証ヘッダを送信することができます。
@トムニコルスの答えに似ています。 HTTPBasicAuthHandler
のサブクラス化もHTTPS要求を処理します。ここ
import urllib2
import base64
class PreemptiveBasicAuthHandler(urllib2.HTTPBasicAuthHandler):
'''Preemptive basic auth.
Instead of waiting for a 403 to then retry with the credentials,
send the credentials if the url is handled by the password manager.
Note: please use realm=None when calling add_password.'''
def http_request(self, req):
url = req.get_full_url()
realm = None
# this is very similar to the code from retry_http_basic_auth()
# but returns a request object.
user, pw = self.passwd.find_user_password(realm, url)
if pw:
raw = "%s:%s" % (user, pw)
auth = 'Basic %s' % base64.b64encode(raw).strip()
req.add_unredirected_header(self.auth_header, auth)
return req
https_request = http_request
はあなたに401
HTTPエラーを(AUTHで再試行)送信しませんジェンキンスサーバーに対処するための一例です。私は簡単にするためにurllib2.install_opener
を使用しています。
jenkins_url = "https://jenkins.example.com"
username = "johndoe"
api_token = "some-cryptic-value"
auth_handler = PreemptiveBasicAuthHandler()
auth_handler.add_password(
realm=None, # default realm.
uri=jenkins_url,
user=username,
passwd=api_token)
opener = urllib2.build_opener(auth_handler)
urllib2.install_opener(opener)
必要なもの、試したこと、UIツールの仕組みについて詳しく説明してください。 – TryPyPy