问题 使用Python和urllib2进行Windows身份验证


我想从需要我的Windows用户名和密码的网页上获取一些数据。

到目前为止,我有:

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

这是urllib2支持的吗?我发现了 Python NTLM,但这需要我输入我的用户名和密码。有没有办法以某种方式获取身份验证信息(例如像IE一样,或Firefox,如果我改变了 network.automatic-ntlm-auth.trusted-uris 设置)。

在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 - 错误的请求。有没有人有任何进一步的想法?

谢谢,

大教堂


8890
2018-05-26 08:48


起源

也许是因为 我的问题 会帮助你。 - kender
通过“获取身份验证信息”的意思,从某个地方获取您的域名和密码,并在您的脚本中使用它们?我很想知道它是否可能:) - kender
@kender - 是的,这正是我的意思。 - Dominic Rodger


答案:


假设您在Windows上编写客户端代码并需要无缝的NTLM身份验证,那么您应该阅读Mark Hammond的 在NTLM中挂钩 来自python-win32邮件列表的帖子基本上回答了同样的问题。这指向Python Win32扩展中包含的sspi示例代码(包含在其中) ActivePython的 否则可以 在这里下载)。


16
2018-05-26 10:34



好的 - 这看起来像我想要去,谢谢。 - Dominic Rodger


网站可以使用多种形式的身份验证。

  1. HTTP身份验证。这是浏览器弹出一个窗口,供您输入用户名和密码。有两种机制:基本和摘要。有一个“授权”标题随页面一起告诉浏览器(或使用urllib2的程序)该怎么做。

    在这种情况下,您必须配置urlopener以提供授权标头需要查看的答案。你需要建立一个 HTTPBasicAuthHandler 要么 HTTPDigestAuthHandler

    AuthHandlers需要一个 PasswordManager。这个密码管理器可能有一个硬编码的用户名和密码(非常常见),或者它可能很聪明,可以从某些Windows API中找出你的Windows密码。

  2. 应用认证。这是Web应用程序将您引导到包含您使用用户名和密码填写的表单的页面的位置。在这种情况下,您的Python程序必须使用urllib2来执行POST(a 请求数据)数据是填写正确的表格。对帖子的回复通常包含一个cookie,允许您进一步访问。你不需要担心cookie,urllib2会自动处理这个问题。

你怎么知道你有哪些?您在响应上转储标头。来自urllib2.openurl的响应包括所有标题(in page.info())以及页面内容。

Python中的HTTP身份验证

如何使用urllib,urllib2和ClientCookie通过Python脚本登录phpBB3论坛?

如何从(非Web)python客户端访问经过身份验证的Google App Engine服务?


-2
2018-05-26 10:08



OP询问有关不使用基本或摘要的集成Windows安全性。 - bpeikes