2017-01-31 14 views
0

kerberos 인증을 사용하여 연결을 설정하려고합니다. 나는 내가 가지고있는 질문이 서버의 유형 (내 경우에는 그것이 cognos tm1 서버 임)과 언어 (패키지 httr (또는 RCurl)의 사용에 대한 나의 경우 R)에 의존하지 않는다고 생각한다. s) 것.Kerberos 인증을 사용하여 연결 설정

나는 kerberos를 사용하는 데 많은 경험이 없습니다. 내 이해에 따라 클라이언트와 서버간에 다음 단계 (여기서는 요청)에 따라 협상이 진행됩니다. 패스해야 할 필요가있는 유일한 것은 사용자 이름이며, 암호가 필요하지 않습니다.

  1. get (url) ->이 authmethod가 지원됨을 알리는 "WWW-Authenticate : Kerberos"헤더를 반환합니다.
  2. GET (URL, 헤더 =위한 인증 : "협상"+ 토큰) -> 두 번째 요청, 헤더 정보 "협상"플러스 토큰
  3. 서버와이 시간이 약간위한 인증 정보를 반환합니다.
  4. 받은 사항 다시 헤더에서 전송 될 수 있고, 요청 된 데이터는 다시

HTTR (TYPE = gssnegotiate) 또는 컬 (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 

내가

library(RCurl) 
getURL(url, user = "username", userpwd="", httpauth = 4, verbose = TRUE, ssl.verifypeer = FALSE, ssl.verifyhost = FALSE) 

불행하게도 컬 같은 사용 (R)을 시도,이 성공은 물론 아니었다 :

< 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

Kerberos는 사용자/암호를 신경 쓰지 않습니다. 먼저 티켓을 파일 캐시에 저장하는'kinit' 명령과 함께 Kerberos 티켓 *을 얻어야합니다. 그러면 HTTP 클라이언트가 SPNEGO에 사용할 수있는 티켓을 갖게됩니다. –

+0

패키지가'libcurl'의 이전 버전을 호출하면 버그가 발생할 수 있습니다 (cf. https://curl.haxx.se/mail/tracker-2015-03/0030.html –

+0

실제 질문은 Microsoft에서 Kerberos (SSPI)를 구현 한 Windows 또는 Linux/OSX에서 작업하고 있습니까? "일반"구현 (GSSAPI)? –

답변

0

서버에 WWW-Authenticate: Kerberos이 필요하지만 SPNEGO 만 말하기 때문에 작동하지 않습니다. 서버를 수정하여 WWW-Authenticate: Negotiate을 요청하면 제대로 작동합니다.

참고 : HTTP를 통해 순수 Kerberos를 지원하는 주요 브라우저는 없으므로 다른 라이브러리에서 그렇게 할 것으로 기대하지 마십시오.