Authentifizierung am HTTP-Task (Java)

  • Hallo,
    ich versuche mich am HTTP-Task eines Domino8 via Java folgendermaßen zu authentifizieren:


    <div class="code">
    String httpUrl = memo.getHttpURL();
    Authenticator.setDefault(new MyAuthenticator(config.getNotesUser(), config.getNotesPassword()));
    URL url = new URL(httpUrl);
    URLConnection conn = url.openConnection();
    InputStream input = conn.getInputStream();
    conn.connect();
    </div>


    mit


    <div class="code">
    class MyAuthenticator extends Authenticator {
    String user = "";
    String password = "";
    MyAuthenticator(String u, String pw){
    user = u;
    password = pw;
    }
    public PasswordAuthentication getPasswordAuthentication() {
    return (new PasswordAuthentication(user, password.toCharArray()));
    }
    }
    </div>


    das ganze funktioniert auf meinem Testsystem auch wunderbar, am Produktivsystem scheitert aber die Anmeldung, so dass ich, wenn ich mir die HTML-Seite aus dem Inputstream holen will, nur eine Seite mit einem Formular zurückbekomme, dass mich zur Anmeldung auffordert. Benutzername und Passwort sind definitiv richtig. Muss ich noch irgendwelche Einstellungen beachten, die evtl. genau mein Vorhaben verbieten, oder was mache ich falsch?

  • Zunächst, Danke für die schnelle Antwort.


    Session Authentication ist auf meinem Testsystem in der Tat "disabled". Auf dem Produktivsystem kann ich das leider so schnell nicht nachprüfen, da ich hier keinen Zugang zum Administrator habe, es sei denn, man kann das irgendwie API-seitig prüfen.


    (was genau wird denn durch "Session Authentication" geregelt? heisst dass, dass ich immer eine Session (lotus.domino.Session) haben muss, um Zugriff zu bekommen?)


    Die Anmeldemaske ist ein Standardhtml-Formular mit zwei Textfeldern(User&PW) und einem Anmeldebutton, der auf die names.nsf verweist, und dann zum entsprechenden Dokument redirected.

  • Kannst du ganz einfach sehen:


    Ist es aktiviert kommt eine HTML Maske zum Anmelden, ist es deaktiviert dann eine Dialogbox.


    Das hat mit der NotesSession erst mal gar nichts zu tun, sondern mit einer HTTP Session.
    Da wird dann eben ein Cookie generiert wenn man sich angemeldet hat.


    Unterscheiden tun die sich eben dadurch, daß bei der einfachen Authentifzierung eine HTTP Antwort generiert wird, die man z.B. mit dem Authenticator beantworten kann, bei einer Session Authentication das ganze aber über Anmeldemasken und Cookies abgehandelt wird.
    Da wirst du dich wohl am Server per URL Aufruf anmelden müssen und Benutzername und Passwort mitgeben

  • Super, danke für die Infos. Habe die Einstellung an meinem Testsystem mal auf "Single Server" geändert, und siehe da, exakt das Verhalten, das auch die Produktivumgebung an den Tag legt.


    Wenn Du mir jetzt noch sagen könntest, wie die Struktur der URL aussehen muss, damit ich mich via dieser anmelden kann, wäre das ein Hit :)


    konkret sehen die Urls ja (in etwa) so aus:


    http://host/datenbank.nsf/viewid/dokumentid?OpenDocument


    kann ich den Login dann einfach in der Form "?Login=xxx?Password=abc" hinten dran hängen?

  • hm, wenn ich mir den String folgendermaßen bastel:


    StringBuffer loginBuffer = new StringBuffer();
    loginBuffer.append("http://");
    loginBuffer.append(config.getNotesServer());
    loginBuffer.append("/names.nsf?");
    loginBuffer.append("Login&");
    loginBuffer.append("username=");
    loginBuffer.append(config.getNotesUser());
    loginBuffer.append("&password=");
    loginBuffer.append(config.getNotesPassword());
    String loginString = loginBuffer.toString();




    und dann zu der URL connecte:


    URL loginUrl = new URL(loginString);
    URLConnection loginConn = loginUrl.openConnection();
    loginConn.connect();


    bekomme ich zwar keinen Fehler, wenn ich allerdings danach ein


    dokument.getHttpUrl();


    versuche via URL zu öffnen, bekomme ich erneut nur die HTML-Seite mit der Loginform.


    edit: wenn ich die LoginParameter an die DokumentenUrl hänge, bekomme ich die DominoWebStartseite heraus (die, die auf die Helpfiles und ibm.com und lotus.com verlinkt). Muss ich das verstehen?


    edit2: das Prinzip funktioniert, also wenn ich die Urls per Hand in den Browser eingebe. Nur programmatisch will es nicht! Bekomme ich aber (hoffentlich) schon noch irgendwie hin. Besten Dank nochmal, das war echt schnelle und gute Hilfestellung!


    edit3: Kommando zurück, nur "selbstgebastelte" Urls "funktionieren". Urls die von dokument.getHttpUrl() kommen, zeigen nach wie vor die LoginMaske an! Wieso?

  • Vermutlich weil du den Session Cookie nicht speicherst und weiterverwendest.


    Ein Browser tut das automatisch. In deinem eigenen Programm musst du die Verwaltung selbst übernehmen und es bei jedem Aufruf mitschicken

  • Ok, macht ja Sinn :)


    Habe daher jetzt die Verbindung mit dem Jakarta HTTP-Client aufgebaut. Dieser spricht in seinen Log-Ausgaben auch von einem Cookie:


    >> Cookie: DomAuthSessId=38A2841E6.....


    Trotzdem bekomme ich, wenn ich ein konkretes Dokument anfordere (nachdem ich mich authentifiziert habe), ein leeres Dokument zurück. Wobei "leer" heisst, es beinhaltet keinen Content. JavaScript Funktionen sind ohne Ende vorhanden, allerdings sehe ich den Sinn dieser nicht.

  • Den ganzen JavaScriptcode hier zu posten, würde den Rahmen sprengen, es beginnt mit:


    Code
    <script type="text/javascript">var h_PageUnid="6F4FFB21152828D7C125761C0032D516",h_PDCheck='<a href="/">x</a>',CcE=[4,1,1,1,1,1,0,1,1], haiku={aCompressible:'0,0,0,0'.split(',')}, s_FF='/iNotes/Forms8.nsf', s_FormsTLM='20090115T150350,33Z';</script>


    und dann folgende etliche Funktionen(DSn(), DeD(), Ctp(), KG(), ... ). Circa 26k Zeichen, deren Sinn sich mir wie gesagt nicht ergibt. Danach folgt ein

    Code
    <!-- Page contents -->


    gefolgt vom schliessenden Body- und HTML-Tag.


    Was die Authentifizierung angeht, ich dachte, wenn ich ein neues httpget im httpclient-Objekt ausführe, in dem ich vorher die Auth durchgeführt habe, würden die Cookies so oder so übernommen?!?
    (wie mache ich das denn sonst?)

  • Also das deutet auf eine Zugriff aufs Mailfile hin.
    Eventuell ein falscher Pfad oder so angegeben ?


    Nein das Cookie muss bei der Anfrage im Header mitgeliefert werden.


    Schau dir dazu doch mal die entsprechenden Java Methoden an

  • also die Log-Ausgaben die von
    httpclient.execute(httpget2);


    verursacht werden, zeigen mir das Cookie


    DomAuthSessId


    aber an. Was mir allerdings grade erst aufgefallen ist, mitten in den (ja doch sehr umfangreichen Log-Ausgaben gibt es eine Exception:

    Code
    org.apache.http.NoHttpResponseException: The target server failed to respond


    denke, da liegt das Problem an sich

  • der Fehler kam wohl Zustande, weil ich versucht habe 2 verschiedene Urls über ein http-Client Objekt anzusprechen.


    Wenn ich jetzt via:

    Code
    CookieStore cs =  httpclient.getCookieStore();
    DefaultHttpClient httpclient2 = new DefaultHttpClient();
    httpclient2.setCookieStore(cs);


    die Cookies übergebe, bekomme ich wieder die Seite mit den JavaScriptfkt. und dem Platzhalter für den Content. Weiter bin ich also immer noch nicht.

  • Wie gesagt scheinst du da auf die Startseite des Mailfiles zuzugreifen und diese macht normalerweise eine Weiterleitung zum eigentlichen Inhalt.


    Und vor dem Javascript hast du sicher noch anderen HTML Code

  • Also, die URL die ich aufrufe, zeigt mir in einem Browser eingegeben direkt das entsprechende Dokument an. Es wird ja auch direkt die UID und OpenDocument aufgerufen. Klar steht vor dem JavaScriptcode noch ein wenig HTML:


    HTML
    <!-- (c) Copyright 1985-2007 IBM Corporation. All rights reserved. -->[\r][\n]"
    <!-- $HaikuForm - 211 -->[\r][\n]"
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> [\n]"
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />[\n]"
    <meta http-equiv="Content-Script-Type" content="text/javascript; charset=ISO-8859-1" />[\n]"
    <!-- Domino Release 8.0.1 (Windows NT/Intel) -->[\n]"
    <script type="text/javascript">...


    Den hielt ich aber eigentlich für überflüssig hier zu posten

  • jetzt läuft das ganze auf meinem 8ter Testsystem, ich portiere alles aufs Produktivsystem (auch ein 8ter), und.. siehe da...welch überraschung, das Ergebnis ist ein anderes. Anstatt der HTML-Darstellung des Dokuments bekomme ich ein Dokument mit folgendem Element:



    Muss ich am Server noch irgendwas explizit erlauben, damit die ganze Geschichte funktioniert?