我正在尝试使用 kerberos 身份验证建立连接。我认为我遇到的问题不取决于服务器的类型(在我的情况下它是 cognos tm1 服务器)或语言(在我的情况下 R 使用包 httr(或 RCurl)),因为它更像是一个通用的 http( s) 东西。
我没有太多使用 kerberos 的经验。据我了解,客户端和服务器之间会按照以下步骤进行一些协商(此处为 get-requests)。我唯一需要传递的是用户名,不需要密码。
- get(url) -> 返回一个“WWW-Authenticate: Kerberos”标头,告诉此身份验证方法受支持。
- get(url, header = Authentification: "Negotiate" + token ) --> 第二个请求,这次是头信息 "Negotiate" 加上 token
- 服务器返回一些认证细节。
- 收到的详细信息可以在标头中再次发送,并将请求的数据发回
httr (type = gssnegotiate) 或 curl (4 = CURLAUTH_NEGOTIATE) 允许输入协商类型。我想,这应该完成上述协商过程并直接返回请求的数据。情况似乎并非如此:
library(httr)
httr::set_config(config( ssl_verifypeer = 0L))
httr::set_config(config( ssl_verifyhost = 0L))
GET(url, authenticate(user = "user", password = "", type = "gssnegotiate"), verbose = TRUE)
不返回所需的结果。日志说:
-> GET /api/v1/Dimensions('Time')/Hierarchies('Time')/Subsets('Yesterday')/Elements HTTP/1.1
-> Host: myhostaddress.com:20049
-> User-Agent: libcurl/7.47.1 r-curl/1.2 httr/1.2.1
-> Accept-Encoding: gzip, deflate
-> Cookie: TM1SessionId=tbQcdXh4PsIHUQdkW_UyNQ
-> Accept: application/json, text/xml, application/xml, */*
->
<- HTTP/1.1 401 Unauthorized
<- Content-Type: text/plain
<- Content-Length: 0
<- Connection: keep-alive
<- OData-Version: 4.0
<- WWW-Authenticate: Kerberos
<-
* Connection #0 to host myhostaddress.com left intact
我尝试使用(R)curl
library(RCurl)
getURL(url, user = "username", userpwd="", httpauth = 4, verbose = TRUE, ssl.verifypeer = FALSE, ssl.verifyhost = FALSE)
不幸的是,这也没有成功:
< HTTP/1.1 401 Unauthorized
< Content-Type: text/plain
< Content-Length: 0
< Connection: keep-alive
< OData-Version: 4.0
< Set-Cookie: TM1SessionId=WMSrJHGTps0RIbmjCCaW5w; Path=/api/; HttpOnly; Secure
< WWW-Authenticate: Kerberos
您对我如何获得所需数据有任何提示吗?我也在考虑手动实施上述步骤。由于我被困在第 2 步,因为我没有要在协商标头中发送的令牌(并且也不知道从哪里获取它)。