cap*_*tan 2 python kerberos python-requests
我尝试使用请求通过 python 访问公司 Intranet 上的 SAS 服务,但由于身份验证失败 (401),我无法使其工作。
\n\n我在 Windows 10 上使用 python 3.7.4,请求 2.22.0。到目前为止,我已经尝试/检查过:
\n\nrequests.get(follow_redirects=True)HTTPBasicAuth(\'user\', \'pass\'),HTTPDigestAuth(),HttpNtlmAuth(\'user\', \'pass\')requests_kerberos.HTTPKerberosAuth(),包括设置force_preemptive=True标志和principal=user@REALM。我已确认klist确实存在多张门票。requests_gssapi.HTTPSPNEGOAuth().curl -i -L -v --negotiate --user "domain\\user:pswd" <protected_service_url>进行身份验证。www-authenticate: Negotiate,使用身份验证票证进行响应。Chrome 请求
\n\n[truncated]Authorization: Negotiate YIIIsgYGKwYBBQUCoIIIpjCC...\n GSS-API Generic Security Service Application Program Interface\n OID: 1.3.6.1.5.5.2 (SPNEGO - Simple Protected Negotiation)\n Simple Protected Negotiation\n negTokenInit\n mechTypes: 4 items\n mechToken: 6082086406092a864886f71201020201006e820853308208\xe2\x80\xa6\n krb5_blob: 6082086406092a864886f71201020201006e820853308208\xe2\x80\xa6\n KRB5 OID: 1.2.840.113554.1.2.2 (KRB5 - Kerberos 5)\n krb5_tok_id: KRB5_AP_REQ (0x0001)\n Kerberos\nRun Code Online (Sandbox Code Playgroud)\n\n=> Chrome 响应状态
\n\nHTTP/1.1 302 Found \nRun Code Online (Sandbox Code Playgroud)\n\n然后浏览器会自动重定向到该服务。
\n\n这是requests_gssapi.HTTPSPNEGOAuth()不成功的请求:
[truncated]Authorization: Negotiate YIIHQQYJKoZIhvcSAQICAQBuggcw...\n GSS-API Generic Security Service Application Program Interface\n OID: 1.2.840.113554.1.2.2 (KRB5 - Kerberos 5)\n krb5_blob: 01006e8207303082072ca003020105a10302010ea2070305\xe2\x80\xa6\n krb5_tok_id: KRB5_AP_REQ (0x0001)\n Kerberos\n\nRun Code Online (Sandbox Code Playgroud)\n\n=> 响应状态
\n\nHTTP/1.1 401 Unauthorized (text/html)\nRun Code Online (Sandbox Code Playgroud)\n\n我现在的测试代码是:
\n\n[truncated]Authorization: Negotiate YIIIsgYGKwYBBQUCoIIIpjCC...\n GSS-API Generic Security Service Application Program Interface\n OID: 1.3.6.1.5.5.2 (SPNEGO - Simple Protected Negotiation)\n Simple Protected Negotiation\n negTokenInit\n mechTypes: 4 items\n mechToken: 6082086406092a864886f71201020201006e820853308208\xe2\x80\xa6\n krb5_blob: 6082086406092a864886f71201020201006e820853308208\xe2\x80\xa6\n KRB5 OID: 1.2.840.113554.1.2.2 (KRB5 - Kerberos 5)\n krb5_tok_id: KRB5_AP_REQ (0x0001)\n Kerberos\nRun Code Online (Sandbox Code Playgroud)\n\n使用requests-gssapi库让我最接近,但身份验证仍然失败。我不懂为什么。使用的 Kerberos 票证是相同的。我可以看到成功的 Chrome 请求和失败的 python 请求之间的唯一区别是OID. 但是我不知道如何改变它,因为它似乎是一个库实现细节。
任何帮助表示赞赏。
\n我设法解决了这个问题。因此,对于面临类似问题的任何人,以下是我的步骤:
import gssapi
import requests
from requests_gssapi import HTTPSPNEGOAuth
try:
spnego = gssapi.mechs.Mechanism.from_sasl_name("SPNEGO")
except AttributeError:
spnego = gssapi.OID.from_int_seq("1.3.6.1.5.5.2")
gssapi_auth = HTTPSPNEGOAuth(mech=spnego)
r = requests.get("http://example.org", auth=gssapi_auth)
Run Code Online (Sandbox Code Playgroud)
并做了!