在标头中请求/发送Kerberos令牌与pycurl.HTTPAUTH_GSSNEGOTIATE

时间:2018-08-15 15:08:49

标签: python authentication python-requests kerberos gssapi

我正在尝试从使用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)

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

1 个答案:

答案 0 :(得分:0)

好吧,我知道了。我在标题中错误地发送了令牌。标头实际上应如下所示:

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

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