13

Windows のユーザー名とパスワードが必要な Web ページからデータを取得したいと考えています。

これまでのところ、私は持っています:

opener = build_opener()
try:
    page = opener.open("http://somepagewhichneedsmywindowsusernameandpassword/")
    print page
except URLError:
    print "Oh noes."

これは urllib2 でサポートされていますか? Python NTLMを見つけましたが、ユーザー名とパスワードを入力する必要があります。何らかの方法で認証情報を取得する方法はありますか (たとえば、network.automatic-ntlm-auth.trusted-uris設定を変更した場合は IE や Firefox のように)。

msanderの回答後に編集

だから私は今これを持っています:

# Send a simple "message" over a socket - send the number of bytes first,
# then the string.  Ditto for receive.
def _send_msg(s, m):
    s.send(struct.pack("i", len(m)))
    s.send(m)

def _get_msg(s):
    size_data = s.recv(struct.calcsize("i"))
    if not size_data:
        return None
    cb = struct.unpack("i", size_data)[0]
    return s.recv(cb)

def sspi_client():
    c = httplib.HTTPConnection("myserver")
    c.connect()
    # Do the auth dance.
    ca = sspi.ClientAuth("NTLM", win32api.GetUserName())
    data = None
    while 1:
        err, out_buf = ca.authorize(data) # error 400 triggered by this line
        _send_msg(c.sock, out_buf[0].Buffer)

        if err==0:
            break

        data = _get_msg(c.sock)

    print "Auth dance complete - sending a few encryted messages"
    # Assume out data is sensitive - encrypt the message.
    for data in "Hello from the client".split():
        blob, key = ca.encrypt(data)
        _send_msg(c.sock, blob)
        _send_msg(c.sock, key)
    c.sock.close()
    print "Client completed."

これはかなりうまくリッピングされていますsocket_server.pyここを参照)。しかし、エラー 400 - 不正な要求が表示されます。他に何かアイデアはありますか?

ありがとう、

ドム

4

2 に答える 2

16

Windows でクライアント コードを作成していて、シームレスな NTLM 認証が必要であると仮定すると、python-win32 メーリング リストにある Mark Hammond のNTLM でのフックの投稿を読む必要があります。これは基本的に同じ質問に答えています。これは、Python Win32 拡張機能に含まれている sspi サンプル コードを示しています (これはActivePythonに含まれていますが、それ以外の場合はここからダウンロードできます)。

于 2009-05-26T10:34:05.467 に答える
-2

Webサイトが使用できる認証にはいくつかの形式があります。

  1. HTTP認証。これは、ブラウザがユーザー名とパスワードを入力するためのウィンドウをポップアップする場所です。基本とダイジェストの2つのメカニズムがあります。ブラウザ(またはurllib2を使用するプログラム)に何をすべきかを指示するページに付属する「認証」ヘッダーがあります。

    この場合、許可ヘッダーが表示する必要のある回答を提供するようにurlopenerを構成する必要があります。HTTPBasicAuthHandlerまたはHTTPDigestAuthHandlerのいずれかを作成する必要があります。

    AuthHandlerにはPasswordManagerが必要です。このパスワードマネージャーは、ハードコードされたユーザー名とパスワード(非常に一般的)を持っている場合もあれば、賢くてWindowsAPIからWindowsパスワードを計算する場合もあります。

  2. アプリケーション認証。これは、Webアプリケーションが、ユーザー名とパスワードを入力したフォームのあるページに移動する場所です。この場合、Pythonプログラムはurllib2を使用してPOST(データを含むリクエスト)を実行する必要があります。ここで、データは適切に入力されたフォームです。投稿への返信には通常、Cookieが含まれています。これにより、さらにアクセスできるようになります。Cookieについてあまり心配する必要はありません。urllib2はこれを自動的に処理します。

自分が持っているものをどうやって知るのですか?応答にヘッダーをダンプします。urllib2.openurlからの応答には、すべてのヘッダー(内page.info())とページコンテンツが含まれます。

PythonでHTTP認証を読む

urllib、urllib2、ClientCookieを使用してPythonスクリプトを介してphpBB3フォーラムにログインするにはどうすればよいですか?

(Web以外の)Pythonクライアントから認証済みのGoogle App Engineサービスにアクセスするにはどうすればよいですか?

于 2009-05-26T10:08:29.433 に答える