2017-01-31 6 views
0

Ich versuche, eine Verbindung mit Kerberos-Authentifizierung herzustellen. Ich denke, die Frage, die ich habe, hängt nicht von der Art des Servers ab (in meinem Fall ist es ein cognos tm1 Server) oder der Sprache (in meinem Fall R mit der Verwendung des Pakets httr (oder RCurl)), da es eher ein allgemeines http ist (s) Sache.Herstellen einer Verbindung mit Kerberos-Authentifizierung

Ich habe nicht viel Erfahrung mit Kerberos. Nach meinem Verständnis gibt es einige Verhandlungen zwischen dem Client und dem Server, die die folgenden Schritte ausführen (hier Get-Requests). Das einzige Thin, das ich bestehen muss, ist ein Benutzername, es wird kein Passwort benötigt.

  1. get (url) -> einen "WWW-Authenticate: Kerberos" Header zurückgeben, dieser Authythmus wird unterstützt.
  2. get (url, header = Authentification: "Verhandeln" + Token) -> zweite Anforderung, diesmal mit Header-Informationen "Verhandeln" plus Token
  3. Server gibt einige Authentifikations Details.
  4. Received Details können wieder im Header gesendet werden, und die angeforderten Daten zurück

HTTR (type = gssnegotiate) oder curl (4 = CURLAUTH_NEGOTIATE) erlauben eingeben Verhandlungstypen gesendet. Ich dachte, dies sollte den oben beschriebenen Verhandlungsprozess tun und die angeforderten Daten geradeaus zurückgeben. Dies scheint nicht der Fall zu sein:

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) 

gibt das gewünschte Ergebnis nicht zurück. Das Protokoll sagt:

-> 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 

ich das gleiche mit (R) versucht curl

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

Leider ist dies nicht erfolgreich war auch:

< 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 

Haben Sie Hinweise, wie Ich könnte die gewünschten Daten bekommen? Ich habe auch darüber nachgedacht, die oben beschriebenen Schritte manuell durchzuführen. Ich stecke in Schritt 2 fest, weil ich kein Token habe, um den Verhandlungs-Header zu senden (und weiß auch nicht, wo ich es herbekomme).

+0

Kerberos kümmert sich nicht um Benutzer/Passwort. Sie müssen zuerst ein Kerberos-Ticket * anfordern (z. B. mit dem Befehl "kinit" unter Linux, der das Ticket in einem Dateicache speichert) *, sodass Ihr HTTP-Client das Ticket für SPNEGO verfügbar hat. –

+0

Sie können auch unter Fehlern leiden, wenn Ihr Paket eine ältere Version von 'libcurl' aufruft, vgl. https://curl.haxx.se/mail/tracker-2015-03/0030.html –

+0

Die eigentliche Frage ist: Arbeiten Sie unter Windows, mit der Microsoft-Implementierung von Kerberos (SSPI) oder unter Linux/OSX, mit die "reguläre" Implementierung (GSSAPI)? –

Antwort

0

Dies funktioniert nicht, da der Server WWW-Authenticate: Kerberos erfordert, aber nur SPNEGO spricht. Ändern Sie Ihren Server, um WWW-Authenticate: Negotiate anzufordern, und es wird funktionieren.

Hinweis: Kein großer Browser unterstützt reines Kerberos über HTTP. Erwarten Sie daher keine andere Bibliothek.

Verwandte Themen