首页 > 解决方案 > 在标头与 pycurl.HTTPAUTH_GSSNEGOTIATE 中请求/发送 Kerberos 令牌

问题描述

我正在尝试从使用 Kerberos 身份验证的 Intranet 站点请求 json 响应。

我像这样制作了一个 kinit(没有 keytab):

kinit employee_id@CORP.MYCOMPANY.COM

这样做之后,以下代码可以工作并给我我想要的确切 json 响应:

def __make_request(self):
    curl = pycurl.Curl()
    data = BytesIO()
    curl.setopt(pycurl.HTTPAUTH, pycurl.HTTPAUTH_GSSNEGOTIATE)
    curl.setopt(pycurl.USERPWD, self.pwd)
    curl.setopt(pycurl.WRITEFUNCTION, data.write)
    curl.setopt(pycurl.URL, self.url)
    curl.perform()
    curl.close()
    return json.loads(data.getvalue())

这当然看起来太容易了。我决定用 gssapi 试试:

server_name = gssapi.Name('HTTP/service_principal_here@OTHER_REALM.COM') <-listed on TGT
canon_name = server_name.canonicalize(gssapi.MechType.kerberos)
ctx = gssapi.SecurityContext(name=canon_name, usage='initiate')
token = ctx.step()
token64 = base64.b64encode(token)

(token64 将打印一个长编码令牌)

h = {"www-authenticate": "Negotiate " + token64}
r = requests.get("same url used with pycurl above", headers = h)

这会导致 403(不是 401)

关于我的请求有什么问题的任何想法?

标签: pythonauthenticationpython-requestskerberosgssapi

解决方案


好的,我想通了。我在标头中错误地发送了令牌。标头实际上应该如下所示:

headers = {"Authorization": "Negotiate " + bt64}

我不确定为什么有人会使用 gssapi 并通过 pycurl 请求...尤其是在 gssapi 的文档不是很好的情况下。


推荐阅读