Andreas Dölling: Re-Autorisierung per XMLHttpRequest?

Hallo,

ist es möglich, eine HTTP-Autorisierung mit "AJAX" durchzuführen, so daß sie im Hintergrund abläuft, ohne daß der Benutzer etwas davon merkt?

Ich hatte an so etwas gedacht:
req = new XMLHttpRequest();
req.open('GET', '[url]', true, '[password]', '[username]');
req.onreadystatechange = function () {
  if (req.readyState == 4) {
     if(req.status == 200) {
  dump(req.responseText);
 } else {
      dump("Error loading page\n");
  }
  }
};
req.send(null);

Ist das völliger Unsinn?
Ich muß zu meiner Schande gestehen, daß ich in Sachen HTTP nicht sehr bewandert bin.

Ciao,
Andreas

--
"Das Corporate Design für das Internet sieht eine Reihe von Grafikelementen vor, die die Optik der Webseite visuell und funktionell beeinflussen." - (Zitat aus dem "Styleguide Corporate Design"  eines großen Konzerns...)
  1. hi,

    ist es möglich, eine HTTP-Autorisierung mit "AJAX" durchzuführen, so daß sie im Hintergrund abläuft, ohne daß der Benutzer etwas davon merkt?

    Ja, sollte möglich sein.
    (Wenn's sinnvoll ist?)

    Ich hatte an so etwas gedacht:
    req = new XMLHttpRequest();
    req.open('GET', '[url]', true, '[password]', '[username]');
    req.onreadystatechange = function () {
      if (req.readyState == 4) {
         if(req.status == 200) {

    Die alternative Serverantwort hier wäre wohl ein 403; solltest du dann also ggf. auch noch abfragen, um darauf entsprechend reagieren zu können.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo,

      danke für die schnelle Antwort.

      (Wenn's sinnvoll ist?)

      Hm, ja, da bin ich mir selbst noch nicht so ganz sicher. Es geht mal wieder um die alte Problematik, wie man eine per PHP über einen HTTP-Header vorgenommene Autorisierung nachträglich manipulieren kann.
      Meistens taucht diese Frage ja im Zusammenhang mit der Beendung einer Sitzung auf (Logout).
      In meinem Fall ist es so, daß in einem uralten Projekt, in dem ich gerade herumwühlen darf, die Benutzer ihre Paßwörter ändern können.
      Da allerdings auf jeder Seite wieder per PHP die Werte (PHP_AUTH_USER und PHP_AUTH_PW) der aktuellen Sitzung mit der Datenbank abgeglichen werden, bekommen die Benutzer nach Speicherung des neuen Paßworts eine "Unberechtigter Zugriff"-Meldung (da das neue Paßwort in der Datenbank ja nicht mehr mit PHP_AUTH_PW übereinstimmt).

      Wir haben hier mehrere Lösungsansätze diskutiert, sind allerdings zu dem Schluß gekommen, daß sich mit PHP-Mitteln nichts machen läßt (außer Umstellung auf PHP-Sessions, wofür aber kein Geld da ist).

      Tja, und da kam mir eben der Gedanke, einen Request per Ajax abzusetzen und so die Autorisierung des Browsers zu aktualisieren.
      Klappt aber - zumindest mit meinem Ansatz - nicht.
      (Hinweis: das Ändern des Paßworts geschieht in einem Popup, aus dem heraus auch der "Ajax"-Request abgeschickt wird - aber das sollte ja keine Rolle spielen.)

      Die alternative Serverantwort hier wäre wohl ein 403; solltest du dann also ggf. auch noch abfragen, um darauf entsprechend reagieren zu können.

      Stimmt, danke für den Hinweis.

      Ciao,
      Andreas

      --
      "Das Corporate Design für das Internet sieht eine Reihe von Grafikelementen vor, die die Optik der Webseite visuell und funktionell beeinflussen." - (Zitat aus dem "Styleguide Corporate Design"  eines großen Konzerns...)
      1. hi,

        In meinem Fall ist es so, daß in einem uralten Projekt, in dem ich gerade herumwühlen darf, die Benutzer ihre Paßwörter ändern können.
        Da allerdings auf jeder Seite wieder per PHP die Werte (PHP_AUTH_USER und PHP_AUTH_PW) der aktuellen Sitzung mit der Datenbank abgeglichen werden, bekommen die Benutzer nach Speicherung des neuen Paßworts eine "Unberechtigter Zugriff"-Meldung (da das neue Paßwort in der Datenbank ja nicht mehr mit PHP_AUTH_PW übereinstimmt).
        Wir haben hier mehrere Lösungsansätze diskutiert, sind allerdings zu dem Schluß gekommen, daß sich mit PHP-Mitteln nichts machen läßt (außer Umstellung auf PHP-Sessions, wofür aber kein Geld da ist).

        Hm, was hältst du denn von http://www.php.net/manual/de/features.http-auth.php:
        "Sowohl Netscape als auch der Internet Explorer löschen den lokalen Authentifizierungscache des Browserfensters, wenn der Server eine 401-Meldung zurückgibt. Dies kann benutzt werden, um einen Benutzer "auszuloggen" und eine erneute Eingabe des Benutzernamens/Passworts zu erzwingen."

        Das könnte man doch mal probieren.

        Allerdings beachten:
        "Dieses Verhalten wird vom Authentifizierungsstandard HTTP Basic nicht gefordert, daher sollte man sich nie darauf verlassen. Tests mit Lynx haben gezeigt, dass Lynx die Authentifizierungsinformationen bei Erhalt einer 401-Meldung nicht löscht."

        Gut - aber mit AJAX brauchst du einem Lynx-Benutzer vermutlich noch viel weniger kommen :-)

        Wenn du also die "großen" Browser auf diese Weise schon mal "erwischen" kannst, wäre doch auch für einen großen Teil der Benutzer das Problem vom Tisch. Wie bspw. Opera oder Safari sich verhalten, wäre ggf. zu testen.
        Für die verbleidenden paar Nutzer anderer Browser tut's dann vermutlich auch ein Hinweis, dass sie nach der Änderung ihres Passwortes halt ihre Surf-Session beenden und sich neu anmelden müssen.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Hallo,

          Hm, was hältst du denn von http://www.php.net/manual/de/features.http-auth.php:

          diesen Ansatz hatte zunächst verworfen. Jetzt habe ich aber dank Deines Hinweises noch einmal richtig darüber nachgedacht und mir aus dem (abgewandelten) php.net-Code eine Lösung gebaut, die für mein Problem richtig gut ist!

          Ciao,
          Andreas

          --
          "Das Corporate Design für das Internet sieht eine Reihe von Grafikelementen vor, die die Optik der Webseite visuell und funktionell beeinflussen." - (Zitat aus dem "Styleguide Corporate Design"  eines großen Konzerns...)