Externes Login-Formular | Forum

devKommunikatisten Aug 14 '17
Hallo,


ich möchte das Login-Formular für Oxwall auf einer seperaten Webseite einbinden.

Also: andere Domain mit einem Login-Formular, nach erfolgreicher Anmeldung soll man auf die Oxwall-Seite auf seine Dashboard.Seite weitergeleitet werden.


Kann man die Authentifizierung per API aktivieren / abfragen?

Oder müsste ich auf der externen Seite hart per DB-Abfragen das Login prüfen?

Wie würde eine externe Anmeldung dann erfolgen?

Danke für Hinweise

devKommunikatisten Aug 14 '17
Ich habe folgendes Script versucht:


<?php
define('OW_URL_HOME', 'https://localhost/oxwall_new/index.php');
define('_OW_', true);

define('DS', DIRECTORY_SEPARATOR);

define('OW_DIR_ROOT', dirname(__FILE__) . DS);
require_once(OW_DIR_ROOT . 'ow_includes' . DS . 'init.php');
require_once(OW_DIR_ROOT . 'ow_system_plugins' . DS . 'base/classes/standard_auth.php');
require_once(OW_DIR_ROOT . 'ow_core' . DS . 'session.php');
$username = $_GET['username'];
$password = $_GET['password'];


$adapter = new BASE_CLASS_StandardAuth($username,$password);
$result = OW::getUser()->authenticate($adapter, true);
     
                if ( $result->isValid() )
                {
                    if ( isset($data['remember']) )
                    {
                        $loginCookie = $this->userService->saveLoginCookie(OW::getUser()->getId());
     
                        setcookie('ow_login', $loginCookie->getCookie(), (time() + 86400 * 7), '/', null, null, true);
                    }
            
                }
    
session_regenerate_id();     

header('Location:https://localhost/oxwall_new/index.php')
?>



Allerdings funktioniert diese Zeile nicht:


$result = OW::getUser()->authenticate($adapter, true);


Das klappt noch:


$adapter = new BASE_CLASS_StandardAuth($username,$password);


aber dann komme ich nicht weiter damit ... aber der Weg scheint die richtige Richtung



Danke

devKommunikatisten Aug 16 '17
Ich komme da leider nicht weiter, aber ein externes Login-Form mit Login und Passwort vergessen Funktion sollte doch machbar sein.
Team
Leo Aug 17 '17
Systemmeldung: Dieses Thema wurde aus dem Forum "Allgemein" verschoben.
Team
Leo Aug 17 '17
Grundsätzlich ist es möglich, eine Anmeldung auf einer Drittseite zu realisieren. Es gibt standardmäßig zwar keine API dafür, aber wie du bereits richtig begonnen hast, kann man sich selbst ein kurzes Skript schreiben. Dazu ein paar allgemeine Worte:

Der Loginprozess ist ein sehr sensibler Prozess, den es besonders zu schützen gilt. Das bedeutet, dass die Seite, auf der das Loginformular implementiert werden soll, ebenso sicher sein muss, wie die Oxwall-Installation. Damit meine ich vor allem das Vorhandensein eines SSL-Zertifikats und ggf. weitere HTTP-Security-Header.

Zudem muss sichergestellt werden, dass der Ablauf des Loginprozesses dem der Oxwall-Installation gleicht. Ich habe bereits vor längerer Zeit gegenüber der Oxwall Foundation festgestellt, dass der Loginprozess (und damit verbunden die Passwortspeicherung im Form sicherer Hashes) noch sicherer gestalten werden kann, was bisher leider nicht umgesetzt wurde. Dennoch musst du darauf achten, dass du das Passwort nicht im Klartext als POST-Parameter überträgst und schon gar nicht in der URL-Browserzeile als GET-Parameter, sofern du eine extra API für dein Vorhaben aufbaust. Wenn du stattdessen eine direkte Verbindung zur Datenbank aufbaust, musst du eine normale SQL-Abfrage durchführen, so wie sie auch vom Loginprozess der eigentlichen Oxwall-Installation durchgeführt wird. Gleichzeitig nimmst du damit in Kauf, dass ein externer Datenbankzugriff möglich wird. Das bedeutet, dass nicht nur der lokale Server auf die Datenbank zugreifen kann, sondern im Prinzip jeder. Andere, böswillige Benutzer können damit ebenso wie du Zugriff auf die Datenbank erlangen (durch Kenntnis von Sicherheitslücken, Risiko aber eher gering) oder durch Ausprobieren an die Zugangsdaten gelangen. Abhilfe wird dadurch geschaffen, dass du nur bestimmte IP-Adressen als valide erklärst und somit die IP-Adresse des Servers des Loginformulares einträgst.

Ich möchte dich hier keinesfalls davon abhalten, ein solches Formular bereitzustellen - im Gegenteil, ein solches Vorhaben kann durchaus positive Anwendungsfälle haben. Du musst dir nur der Risiken bewusst sein, die dadurch entstehen. Daher mein Tipp: Sichere deine Oxwall-Installation und diejenige Seite, auf der das Formular integriert werden soll, mit einem SSL-Zertifikat ab (wenn nicht schon geschehen) und programmiere dir ein Plugin, das eine API bereit stellt, um den Login durchzuführen. Diese API sollte den Benutzernamen und das Passwort (als Hash) in Form von POST-Parametern entgegen nehmen, indem du die API vom Loginformular mittels HTTPS-Verbindung aufrufst. Zusätzlich solltest du nicht unendlich viele Versuche erlauben, sondern nach einigen Versuchen den Zugriff auf diesen Account via API sperren.

Die von dir erwähnte Zeile funktioniert deshalb nicht, weil die Methode authenticate() in der Datei /ow_core/user.php in der aktuellen Oxwall-Version lediglich ein Argument erwartet (OW_AuthAdapter $adapter). Dies sollte bei aktiviertem OW_DEV_MODE auf der Seite als PHP-Meldung oder im software-spezifischen Error-Log dokumentiert werden. Du kannst den "Inhalt" einer Variablen in diesem Fall testen, indem du dir die Ausgabe mit der PHP-Funktion print_r() oder var_dump() anzeigen lässt. Dementsprechend kann der weitere Teil nicht ausgeführt werden.
Zuletzt bearbeitet von Leo Aug 19 '17
devKommunikatisten Aug 20 '17
Danke für Deine Antwort. Du hast recht mit der Übergabe der Angaben von Username / Passwort - die GET Variablen sind hier in der Tat nur als Beispiel gedacht gewesen.

Ich habe es mittlerweile gelöst und bin auch fast fertig.

Am Ende steht nun ein kleines eigenes Login-Formular mit den Optionen

1. Username / Passwort
2. Login mit Facebook
3. Login über LinkedIn

Das alles als seperates Script und so einsetzbar, dass es z.B. per Iframe auf einer anderen, externen, Seite eingebunden werden kann. Nach erfolgreichen Anmeldung durch einer der o.g. drei Varianten wird man per window.parent.location.href auf die Startseite des Oxwall-Systems weitergeleitet.

Ich habe es vermeiden können, einen direkten eigenen Zugriff auf die Datenbank zu verwenden, sondern verwende die vorhandenen Klassen und Funktionen aus dem Oxwall-System.

Es ist in der Form sicher noch etwas quick&dirty aber das kann noch angepasst werden.

Danke für Deine Hinweise.


devKommunikatisten Aug 20 '17
Eine Frage hätte ich noch:

ich möchte den UserAvatar mit einem eigenen Skript setzen und ich habe im FaceBook-Connect Plugin diese Lösung gefunden:

BOL_AvatarService :: getInstance () -> setUserAvatar ($ user-> id, $ questions ['picture_big'], array ('isModerable' => false, 'trackAction' => false));

Aber es funktioniert so nicht - die entsprechende URLs zum verwendeten Bild erhalte
ich hier aus den API von Facebook bzw. LinkedIn, die URLs selber sind ok und führen auch
wirklich zum jeweiligen Bild. Allerdings wird Bild wird nicht dem User zugewiesen und der User-Avatar bleibt leer.

Auf der Seite https://www.ipragmatech.com/migrating-users-into-oxwall/ wird über
UserImport geschrieben, da taucht diese Vorgehensweise beim Speichern eines Avatars ebenfalls auf:

$uploadedFileName = "https://www.smoopies.com/dev/profile_pics/" . $file_name . "_0.jpg";
$avatar=$avatarService->setUserAvatar ( $userId, $uploadedFileName);

Hab ich hier noch einen Denkfehler, dass das Speichern so nicht klappt?

Danke
Zuletzt bearbeitet von devKommunikatisten Aug 20 '17
Team
Leo Aug 21 '17

Zitat von devKommunikatisten BOL_AvatarService :: getInstance () -> setUserAvatar ($ user-> id, $ questions ['picture_big'], array ('isModerable' => false, 'trackAction' => false));
Ich nehme an, dass du diesen Aufruf in deinem Skript nicht mit den vielen Leerzeichen geschrieben hast und es demnach nicht daran liegt. Bitte poste dein ganzes Skript, damit ich es mir genauer anschauen kann. Gibt es Fehler, die mit aktiviertem OW_DEV_MODE angezeigt werden oder im Error-Log dokumentiert sind?

Grundsätzlich ist dein Ansatz aber richtig. Zum Vergleich kannst du dir die Methode createAvatar() der Datei /ow_system_plugins/base/mobile/controllers/join.php ansehen, die eine ähnliche Prozedur implementiert.
Zuletzt bearbeitet von Leo Aug 21 '17