1

我正在尝试使用 kerberos 身份验证建立连接。我认为我遇到的问题不取决于服务器的类型(在我的情况下它是 cognos tm1 服务器)或语言(在我的情况下 R 使用包 httr(或 RCurl)),因为它更像是一个通用的 http( s) 东西。

我没有太多使用 kerberos 的经验。据我了解,客户端和服务器之间会按照以下步骤进行一些协商(此处为 get-requests)。我唯一需要传递的是用户名,不需要密码。

  1. get(url) -> 返回一个“WWW-Authenticate: Kerberos”标头,告诉此身份验证方法受支持。
  2. get(url, header = Authentification: "Negotiate" + token ) --> 第二个请求,这次是头信息 "Negotiate" 加上 token
  3. 服务器返回一些认证细节。
  4. 收到的详细信息可以在标头中再次发送,并将请求的数据发回

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 步,因为我没有要在协商标头中发送的令牌(并且也不知道从哪里获取它)。

4

2 回答 2

0

这不起作用,因为服务器需要WWW-Authenticate: Kerberos,但 curl 只与 SPNEGO 对话。修改您的服务器以请求WWW-Authenticate: Negotiate,它将起作用。

注意:没有主流浏览器支持基于 HTTP 的纯 Kerberos,所以不要指望任何其他库会这样做。

于 2017-02-01T19:55:00.670 回答
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)
于 2018-05-09T02:57:36.530 回答