Windows 上 python 的自动 NTLM

Automatic NTLM with python on Windows

如何在 Windows 上使用来自 python 的自动 NTLM 身份验证?

我希望能够从 windows 访问 TFS REST API 而无需硬编码我的密码,就像我从网络浏览器(firefox 的 network.automatic-ntlm- auth.trusted-uris,例如)。

NTLM 凭据基于交互式登录过程中获得的数据,并包含密码的 one-way 哈希。您必须提供凭据。

Python 有 requests_ntlm 允许 HTTP NTLM 身份验证的库。

您可以参考本文访问 TFS REST API: Python Script to Access Team Foundation Server (TFS) Rest API

如果您使用的是 TFS 2017 或 VSTS,您可以尝试在基本身份验证 HTTP Header 中使用 Personal Access Token 以及您的 REST 请求。

我发现 this answer 非常适合我,因为:

  1. 我只会从 Windows 转到 运行,所以便携性不是问题
  2. 响应是一个简单的 json 文档,因此无需存储打开的会话

它使用 WinHTTP.WinHTTPRequest.5.1 COM 对象来本地处理身份验证:

import win32com.client
URL = 'http://bigcorp/tfs/page.aspx'    
COM_OBJ = win32com.client.Dispatch('WinHTTP.WinHTTPRequest.5.1')
COM_OBJ.SetAutoLogonPolicy(0)
COM_OBJ.Open('GET', URL, False)
COM_OBJ.Send()
print(COM_OBJ.ResponseText)

你可以用 https://github.com/requests/requests-kerberos. Under the hood it's using https://github.com/mongodb-labs/winkerberos 做到这一点。后者被标记为 Beta,我不确定它有多稳定。但是我已经使用了一段时间的 requests-kerberos 没有任何问题。

也许更稳定的解决方案是 https://github.com/brandond/requests-negotiate-sspi,它使用 pywin32 的 SSPI 实现。

我在这里找到了解决方案https://github.com/mullender/python-ntlm/issues/21

pip install requests
pip install requests_negotiate_sspi
import requests
from requests_negotiate_sspi import HttpNegotiateAuth

GetUrl = "http://servername/api/controller/Methodname" # Here you need to set your get Web api url
response = requests.get(GetUrl, auth=HttpNegotiateAuth())
print("Get Request Outpot:")
print("--------------------")
print(response.content)

通过 https 请求:

import requests
from requests_negotiate_sspi import HttpNegotiateAuth

import urllib3
urllib3.disable_warnings()

GetUrl = "https://servername/api/controller/Methodname" # Here you need to set your get Web api url
response = requests.get(GetUrl, auth=HttpNegotiateAuth(), verify=False)
print("Get Request Outpot:")
print("--------------------")
print(response.content)