我尝试使用kerberos身份验证建立连接。我认为我的问题并不取决于服务器的类型(在我的情况下是#cognos tm1服务器),也不依赖于语言(在我的情况下R使用包httr(或RCurl)),因为它&#39更像是一般的http(s)事。
我没有太多使用kerberos的经验。根据我的理解,客户端和服务器之间存在一些协商,遵循以下步骤(此处为get-requests)。我需要传递的唯一精简是用户名,不需要密码。
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)卷曲
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步,因为我没有令牌来发送协商标题(并且也不知道从哪里获取它)。
答案 0 :(得分:0)
这不会起作用,因为服务器需要WWW-Authenticate: Kerberos
,但curl只会说SPNEGO。修改您的服务器以请求WWW-Authenticate: Negotiate
,它将起作用。
注意:没有主要的浏览器支持基于HTTP的纯Kerberos,所以不要指望任何其他库这样做。
答案 1 :(得分:0)
在Windows上,您可以使用
library(httr)
GET(url, authenticate(user=":", password="", type="gssnegotiate"), verbose = TRUE)
如果内部网站不需要代理,请明确说明代理如下:
library(httr)
GET(url, use_proxy(""), authenticate(user=":", password="", type="gssnegotiate"), verbose = TRUE)