it-swarm.com.de

single Sign auf (Sso) Laravel

Ich habe drei verschiedene Laravel-Websites, ich möchte, dass sich der Benutzer auf einer Website anmeldet. Dann wird er automatisch bei den anderen beiden Websites angemeldet. Wenn Sie sich an Ihrem stackoverflow angemeldet haben, öffnen Sie stackexchange , und Sie werden mit dem StackOverflow-Konto .. angemeldet. Die meisten Pakete, die auf SAML basieren, habe ich keine Ahnung, warum es bei mir nicht funktioniert hat. Ich weiß nicht, was ich vermisse? Gibt es irgendeine Konfiguration für diese Funktion? Ich bin unter Verwendung von Laravel 5.6. Alle Apps befinden sich auf demselben Server.

Ich habe viele Lösungen ausprobiert, die auf SAML, OpenID und Share Session basieren, aber alle haben nicht mit mir zusammengearbeitet. Ich weiß nicht, ob ich etwas vermisse . Dies ist das letzte Beispiel , das ich versucht habe und es hat nicht funktioniert

das ist mein Code 

SITE A

$site_b = 'http://s_sesstion_2.test/';
Route::get('/', function (Request $request) use ($site_b) {
    $session_id = Session::getId();
    try {
        $http = new Client();
        $response = $http->post($site_b . 'api/sessions/server', [
            'form_params' => [
                'session_id' => $session_id,
            ],
            'headers' => [
                'Accept' => 'application/json',
            ]
        ]);
    } catch (Exception $e) {
        dd($e->getMessage());
    }
    return view('welcome');
});

SITE B (route/api.php)

    Route::post('/sessions/server', function (Request $request) {
    Storage::disk('local')->put('file.txt', $request->get('session_id'));
});

SITE B (route/web.php)

    Route::get('/', function () {
    $session_id = Storage::disk('local')->get('file.txt');
    Session::setId($session_id);
    Session::start();
    //return Session::getId();// will return the same session id
    return \auth()->user();//this should return the auth user but it did not!!
});

Alles, was ich möchte, ist, mich an site A anzumelden. A dann offen site B Ich werde angemeldet sein. Ich werde jede Lösung akzeptieren, die diesen Zweck erfüllt.

7
Mo'auya Meghari

Ich habe eine SSO-Lösung implementiert, ohne SAML zu verwenden. Ich teile meine Lösung hier mit, hoffe es hilft. 

Einmalige Anmeldung

Eine Anwendung wird als Hauptauthentifizierungsserver unter auth.domain ausgeführt. Andere Anwendungen laufen in verschiedenen Domänen app1.domain, app2.domain, ... 

Jeder Benutzer ist mit SSO-Token verbunden. Diese Token haben sehr kurze Verfallszeiten. Alle Authentifizierungsvorgänge (Anmelden, Zurücksetzen von Passwörtern, Registrieren, ...) finden in der Anwendung auth.domainnur statt.

Wenn ein Benutzer Anwendungen besucht, z. B. app-1.domain:

  1. Benutzer auf auth.domain/login umleiten.
  2. Wenn sich der Benutzer zuvor in unserem System angemeldet hat, fahren Sie mit Schritt 6 fort.
  3. Zeigen Sie das Zeichen im Formular an und warten Sie auf gültige Eingaben.
  4. Generieren Sie ein neues SSO-Token mit einer Ablaufzeit von weniger als 3 Minuten.
  5. Fügen Sie der Antwort das auth.domain-Remember-Me-Cookie hinzu.
  6. Senden Sie eine Umleitungsantwort an app-1.domain/sso/{sso_token}.
  7. app-1.domain-Anwendung hat die Datenbank gelesen. Wenn das SSO-Token gültig ist und nicht abläuft, suchen Sie den mit diesem Token verknüpften Benutzer.
  8. app-1.domain authentifiziert den im vorherigen Schritt gefundenen Benutzer mit der Auth::login($user)-Methode.
  9. app-1.domain löscht den empfangenen SSO-Token aus der Datenbank.

Nach diesem Schritt wird der Benutzer bei app-1.domain authentifiziert.

Sitzungsfreigabe

Alle freigegebenen Sitzungsvariablen sollten in Datenbanken gespeichert werden. Ich habe einen neuen Sitzungstreiber implementiert:

  • Behalten Sie die Liste der freigegebenen Sitzungsvariablennamen
  • Überprüfen Sie beim Lesen/Schreiben in Sitzungen den Namen der Sitzungsvariablen. Wenn es sich bei diesem Namen um die vorherige Liste handelt, lesen Sie den Wert aus der Datenbank. Verwenden Sie andernfalls die private Sitzung jeder eigenen Anwendung.
1
Hieu Le

Wenn Ihre beiden Anwendungen dieselben Datenbanken verwenden, können Sie dem Ansatz folgen:

-> Erstellen Sie in Ihrer Datenbank eine Standard-Sitzungs-ID, die zunächst als falsch markiert wird

-> Sobald der Benutzer sich bei einer Site anmeldet, generieren Sie einen neuen Hash und ersetzen Sie ihn durch den Standardwert.


optional

-> Sie können den Hash auch im lokalen Browser des Browsers mit Hash als Schlüssel und Null als Wert speichern.


-> Wenn sich der Benutzer jetzt bei einer Site anmeldet/zu einer Website wechselt, überprüfen Sie diesen Hash -> Wenn der Hashwert der Standardeinstellung entspricht, zeigen Sie die Anmeldeseite an, ansonsten die Profilseite.


Meine Antwort ist nur gültig, wenn Sie eine gemeinsame Datenbank für die Anmeldung verwenden. Andernfalls benötigen Sie ein Mapping.


Alternativ können Sie Cookies zum Speichern von Hash verwenden und auf diese in domänenübergreifender Reihenfolge zugreifen. Sie finden ein Beispiel unter Domainübergreifende Cookies Von @ludovic

0
Rnayak