我正在尝试从使用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)
关于我的请求有什么问题的任何想法吗?
答案 0 :(得分:0)
好吧,我知道了。我在标题中错误地发送了令牌。标头实际上应如下所示:
headers = {"Authorization": "Negotiate " + bt64}
我不确定为什么有人会使用gssapi并通过pycurl请求...尤其是在gssapi的文档不是很好的情况下。