2011-01-07 8 views
1

私はREST APIにアクセスしようとしています。urllib2はプリエンプティブ認証認証をサポートしていますか?

Curl/REST Client(UIツール)でプリエンプティブ認証が有効になっています。

しかし、urllib2を使用すると、これはデフォルトでサポートされていないように見えますが、私はそれを有効にする方法を見つけることができません。

感謝:)あなたが身体を送信する前に

+0

必要なもの、試したこと、UIツールの仕組みについて詳しく説明してください。 – TryPyPy

答えて

6

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 
+0

ありがとうございました。私は本当にあなたに良い説明とこの質問に答える時間がかかることを感謝します。 – thinkanotherone

0

必要とされている認証の種類に応じて、あなたはあなたの要求にそれらを追加することによって、手動で認証ヘッダを送信することができます。

4

@トムニコルスの答えに似ています。 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) 
関連する問題