Hallo,
ich würde gerne einen Agenten über einen Webserver aufrufen.
Mittels
https://myserver.com/path/database.nsf?AgentName?OpenAgent&Parameter1&Parameter2
funktioniert das schon ganz gut, aber jetzt würde ich das gerne in ein Ajax-Konstrukt einbauen.
Aber wie übergebe ich jetzt die passenden Authentifizierungsdaten?
Einfach ein Username:Passwort vor dem Servernamen?
Oder ist der Ansatz schon falsch?
Folgendes Script funktioniert leider nicht (der Klick erzeugt weder einen Fehler noch eine Ausgabe)
<HTML>
<HEAD>
<TITLE> Test: Lotus Notes Agent starten </TITLE>
<script type="text/javascript">
function createXMLHttpRequest() {
var ua;
if(window.XMLHttpRequest) {
try { ua = new XMLHttpRequest(); }
catch(e) { ua = false; }
} else if(window.ActiveXObject) {
try { ua = new ActiveXObject('Microsoft.XMLHTTP'); }
catch(e) { ua = false; }
}
return ua;
}
var req = createXMLHttpRequest();
function notesagent(server,mailbox,agentname,parameter) {
var req = createXMLHttpRequest();
req.onreadystatechange = function() {
switch(req.readyState) {
case 0:
case 1:
case 2:
case 3: return;
case 4: break;
}
resulttext = req.responseText;
document.getElementById("test").innerHTML = resulttext;
}
req.open('get', 'https://username:passwort@'+server+'/'+mailbox+'/'+agentname+'?OpenAgent&'+parameter);
req.send(null);
}
</script>
</HEAD>
<BODY>
<input type="button" value="Klick mich" onClick="notesagent('myserver.com','TestAgent','eins&zwei&drei&vier');">
<div id="test"></div>
</BODY>
</HTML>
Wie stelle ich denn die Sicherheit um, damit der Agent auch unter Anonymous läuft?
Ich habe unter den Einstellungen des Agenten unter Sicherheit das Häkchen bei "Als Webbenutzer ausführen",
beim Vorgabezugriff nur Anonymous angehakt und ebenfalls "Benutzer mit öffentl. Zugriff dürfen Agenten ausführen"
Dennoch wird beim Aufruf des Agenten im Browser das Authentifizierungsfenster angezeigt.
Ich versuche im Moment die Seite mittels cUrl vom Domino zu bekommen.
Ich bin mir recht sicher, dass darüber auch eine Authentifizierung möglich wäre, wenn die richtigen Parameter noch gesetzt werden (die ich bisher noch nicht gefunden habe)
function open_https_url($url,$refer,$usecookie) {
if ($usecookie) {
if (file_exists($usecookie)) {
if (!is_writable($usecookie)) {
return "Error: Can't write to $usecookie cookie file, create an empty cookie.txt file in same folder as script";
}
} else {
$usecookie = "cookie.txt";
if (!is_writable($usecookie)) {
return "Error: Can't write to $usecookie cookie file, create an empty cookie.txt file in same folder as script";
}
}
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURL_HTTP_VERSION_1_1, true);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
if ($usecookie) {
curl_setopt($ch, CURLOPT_COOKIEJAR, $usecookie);
curl_setopt($ch, CURLOPT_COOKIEFILE, $usecookie);
}
if ($refer != "") {
curl_setopt($ch, CURLOPT_REFERER, $refer );
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$result = curl_exec ($ch);
$info = curl_getinfo($ch);
if ($result === false || $info['http_code'] != 200) {
$result = "Error: No cURL data returned for $url [". $info['http_code']. "]";
if (curl_error($ch)) {
$result .= "\n". curl_error($ch);
}
}
curl_close ($ch);
return $result;
}
$dateiurl = "https://myserver.com/mtester.nsf/TestAgent?OpenAgent&test1&test2&test3";
$datei = open_https_url($dateiurl,"",true);
print $datei;
folgender Source-Code liefert als Ergebnis immer: "Error: No cURL data returned for..."
Unabhängig davon ob ich korrekte Zugangsdaten verwende oder nicht:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_HTTPAUTH, "CURL_AUTH_BASIC");
curl_setopt ($ch, CURLOPT_USERPWD, $credentials);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_SSLVERSION, 3);
$headers = array(
"POST ".$page." HTTP/1.0",
"Accept: text/html",
"Cache-Control: no-cache",
"Pragma: no-cache",
"Authorization: Basic " . base64_encode($credentials)
);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURL_HTTP_VERSION_1_1, true);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
if ($usecookie) {
curl_setopt($ch, CURLOPT_COOKIEJAR, $usecookie);
curl_setopt($ch, CURLOPT_COOKIEFILE, $usecookie);
}
if ($refer != "") {
curl_setopt($ch, CURLOPT_REFERER, $refer );
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$result = curl_exec ($ch);
Wenn ich diesen Code verwende, dann erhalte ich überhaupt kein Ergebnis. Auch unabhängig davon, ob ich korrekte Credentials verwende oder nicht.
$headers = array(
"POST ".$page." HTTP/1.0",
"Accept: text/html",
"Cache-Control: no-cache",
"Pragma: no-cache",
"Authorization: Basic " . base64_encode($credentials)
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_USERAGENT, $defined_vars['HTTP_USER_AGENT']);
$data = curl_exec($ch);
Wenn ich per Javascript den Benutzer (oder die IP) ermittle, hab ich ja nicht wirklich gewonnen, da ein anonymer Aufruf über der Browser dann ja auch möglich ist und mein Javascript dann gar nicht ausgeführt wird.
Gibts mit Lotusscript Boardmitteln keine Möglichkeit die IP-Adresse des Clients herauszufinden?
Nur nochmal für mich zum Verständnis des Szenarios.
Du willst mit einem PhP-Script einen Lotus Domino WebAgent per Ajax callen?
Das war der ursprüngliche Plan, den ich dann verworfen habe, da Ajax von Hause aus nicht den Zugriff auf eine fremde Domain unterstützt.
Was aber eigentlich Blödsinn ist, da ich jetzt über Ajax eine PHP-Seite aufrufe, die dann einen einfachen $data = file_get_contents($url)
macht.
Ich hatte geglaubt, dass ich dem Anonymous Berechtigung auf den Agenten geben könnte ohne auf die DB selber. Da die DB aber als Inhalt nur den Agenten enthalten wird, ists auch nicht soo tragisch.
Ich bin mir zwar sicher, dass es auch mittels cUrl irgendwie gehen würde, aber so nehme ich jetzt die Strasse mit weniger Steinen.
Letztlich funktioniert es jetzt. Nicht ganz so, wie geplant, aber ich bin heute mal ergebnisorientiert ;)
Ahh jetzt verstehe ich langsam:
- Auf Apache Mit IP1 läuft PHP welches dir eine Seite generiert
- du willst einen Notes-Agenten per URL auf Server IP2 aufrufen
- auf dem Server ist Basic Authentication aktiviert
Das war der ursprüngliche Plan, den ich dann verworfen habe, da Ajax von Hause aus nicht den Zugriff auf eine fremde Domain unterstützt.
Wie oben gesagt, im Prinzip richtig, aber: https://developer.mozilla.org/En/HTTP_Access_Control
Sofern du Firefox 3.5 hast (zum Testen hier: http://arunranga.com/examples/access-control/simpleXSInvocation.html) könntest du in deinem Notes-Agenten auf IP2 die header entsprechend setzen. Dies ginge so
print "Content-Type: application/x-javascript"
print "Access-Control-Allow-Origin: http://IP1"
print ""
print .... json-data oder was auch immer
Andernfalls braucht man einen PHP-Proxy o.ä. wie du schon geschrieben hast.
Es gäbe aber noch eine weitere Möglichkeit:
du könntest am Apache über "mod_proxy" den Dominoserver in ein virtuelles Verzeichnis legen:
dann kannst du mit http://IP1/dominoproxy/myDb.nsf/myAgent?openAgent den Agenten auf http://IP2/myDb.nsf/myAgent?openAgent öffnen.
Vorteil: Für Ajax/Browser sieht das aus als läuft alles auf dem selben Server und es werden auch alle Header etc übertragen. d.H. es könnte sogar die Authentifizierung klappen.
Gruß
Roland
p.S. Firebug+Co. ist dann Pflicht um das vernünftig debuggen zu können.