使用Kerberos身份验证建立连接

时间:2017-01-31 14:24:01

标签: r kerberos httr spnego cognos-tm1

我尝试使用kerberos身份验证建立连接。我认为我的问题并不取决于服务器的类型(在我的情况下是#cognos tm1服务器),也不依赖于语言(在我的情况下R使用包httr(或RCurl)),因为它&#39更像是一般的http(s)事。

我没有太多使用kerberos的经验。根据我的理解,客户端和服务器之间存在一些协商,遵循以下步骤(此处为get-requests)。我需要传递的唯一精简是用户名,不需要密码。

  1. get(url) - >返回" WWW-Authenticate:Kerberos"支持这个authmethod的标题。
  2. get(url,header = Authentification:" Negotiate" + token ) - >第二个请求,这次是标题信息" Negotiate"加上令牌
  3. 服务器返回一些身份验证详细信息。
  4. 可以再次在标题中发送已接收的详细信息,并将所请求的数据发回
  5. 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步,因为我没有令牌来发送协商标题(并且也不知道从哪里获取它)。

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)