Requesting/sending header 与 pycurl.HTTPAUTH_GSSNEGOTIATE 中的 Kerberos 令牌

Requesting/sending Kerberos token in header vs pycurl.HTTPAUTH_GSSNEGOTIATE

我正在尝试从使用 Kerberos 身份验证的内部网站请求 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)

对我的请求有什么问题有什么想法吗?

好的,我明白了。我在 header 中错误地发送了令牌。 header 实际上应该是这样的:

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

我不确定为什么有人会使用 gssapi 并通过 pycurl 请求...尤其是当 gssapi 的文档不是那么好时。