it-swarm.com.de

Melden Sie sich von einer WordPress-Website zu einer anderen WordPress-Website an

Mein Kunde möchte ausdrücklich nicht die WordPress-Option "Multisite" verwenden.
Mein Kunde hat eine Hauptwebsite und 199 Unterwebsites (andere Domains).
Ein Benutzer hat eine Benutzerkennung mit dem Metaschlüssel: branch_id

Als Beispiel (komplett erfundene Namen):
Hauptseite: kero.com
Sub-Site: uka.com (und viele andere)

Beide Domänen haben SSL-Zertifikate.

Das Endziel lautet wie folgt: Wenn Sie sich auf der Hauptseite (kero.com) anmelden. Ich habe ein Plugin erstellt, das überprüft, welche Filial-ID dem Benutzer zugeordnet ist. Es geht so:

function myplugin_auth_signon( $username, $password ) {  
  $user = get_user_by('email', $username);      
  $user_id = $user->ID;
  $key = 'branch_id';
  $single = true;
  $branch = get_user_meta( $user_id, $key, $single );
  if($branch == 'number') {
    //magic happens here!
    $cookie = "cookie.txt";

    $postdata = "log=" . $username . "&pwd=" . $password . "&wp-submit=Log%20In&redirect_to=" . $url . "wp-admin/&testcookie=1";
    $ch = curl_init();
    curl_setopt ($ch, CURLOPT_URL, $url . "wp-login.php");

    curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
    curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
    curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 0);
    curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie);
    curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie);                
    curl_setopt ($ch, CURLOPT_REFERER, $url . "wp-login.php");

    curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata);
    curl_setopt ($ch, CURLOPT_POST, 1);
    $result = curl_exec ($ch);
    curl_close($ch);
    //This is from the answer of the link. On the end url the users get redirected from wp-admin to my-account
    header('location: ' . $url . 'wp-admin/'); 
    die();

    //after logging in redirect the user to uka.com/my-account
  }

add_action( 'wp_authenticate', 'myplugin_auth_signon', 30, 2 );

Also baue ich alle möglichen Sachen, ich benutze diesen Link auf der // Magie passiert hier: Klicken Sie hier.

Es funktioniert nicht wie beabsichtigt. Es hält mich auf der Hauptwebsite, aber wenn ich auf "Speichern" klicke, befindet es sich auf der Unterwebsite. Wenn ich zu meinem Konto gehe (wo ich angemeldet sein sollte), bin ich nicht mehr angemeldet.

Ich habe einen anderen Code geschrieben:

$response = wp_remote_post( $url, array(
        'method'      => 'POST',
        'timeout'     => 45,
        'redirection' => 5,
        'httpversion' => '1.0',
        'blocking'    => true,
        'headers'     => array(),
        'body'        => array(
            'username' => $username,
            'password' => $password
        ),
        'cookies'     => array()
        )
    );

Ich weiß nicht wirklich, wie ich das für mein persönliches Ziel verwenden soll. Ich kann die Ergebnisse wiedergeben, bekomme dann aber eine große Auswahl an Headern usw. Und wenn ich zur Unterwebsite surfe: Ich bin nicht angemeldet ... Es werden also keine Sitzungen/Cookies gespeichert.

TBH: Ich bin wirklich ein Anfänger in Sachen Session/Cookie/Sicherheit. Die meiste Zeit baue ich in Wordpress oder Laravel und das meiste Sicherheitsmaterial ist dann schon erledigt.

Vielen Dank an alle, die sich die Zeit nehmen, dies zu lesen.

UPDATE: Zusätzlicher Code hinzugefügt!

4
Dennis86

Zum späteren Nachschlagen beantworte ich meine eigene Frage. Haftungsausschluss: Dies war ein freiberuflicher Auftritt und musste in einem X-Zeitrahmen durchgeführt werden. Was bedeutet, dass dies die schnellste und einfachste Option war.

Was ich getan habe war:

  1. Installierte das Plugin https://wordpress.org/plugins/user-session-synchronizer/ - Gib diesem Typen etwas Anerkennung, dieses Plugin ist wahnsinnig gut. Abgesehen von der verrückten Tatsache, dass es KOSTENLOS ist ...
  2. Ich habe mich in den wp_loaded-Hook eingehängt und überprüft, welche Zweig-ID der Benutzer hatte. Das Plugin, das ich geschrieben habe, hatte Optionen mit Zweig-IDs und den URLs. Es hat also nach der Überprüfung, welche Filial-ID der Benutzer hatte, überprüft, welche URL mit der Filial-ID übereinstimmt.

Dann echo'd

echo "<script>setTimeout(function() { parent.self.location='https://server.com'; }, 1500);</script>";
0
Dennis86

Sie können keine Cookies für Site A festlegen, die für Site B gelten. Daher funktioniert Ihr Schema "Anmeldung über Proxy" nicht und funktioniert nicht. Darüber hinaus ist das Speichern von Passwörtern im Klartext nur ein großes Nein-Nein.

1
Mark Kaplun

Ich denke, es wäre möglich , es sicher zu machen, indem man so etwas macht:

  1. Senden Sie im Authentifizierungsfilter die CURL-Anforderung, während Sie dies tun. Der Benutzername/das Kennwort muss mit der Site und der Unterwebsite übereinstimmen (synchronisiert werden).
  2. Senden Sie jetzt eine zweite CURL-Anforderung an die Unterwebsite, um ein temporäres Authentifizierungstoken abzurufen (generiert durch benutzerdefinierten Code auf der Unterwebsite).
  3. Platzieren Sie einen Iframe auf der ursprünglichen Site-Seite (die Seite, zu der nach dem Anmelden umgeleitet wurde) ... wobei der Iframe src auf die Unterwebsite gesetzt ist und der temporäre Code (und Benutzername) im Querystring gesendet werden. (Alternativ können Sie auch einfach mit derselben URL zur Unterwebsite umleiten.)
  4. Verfügen Sie über einen benutzerdefinierten Code auf der Unterwebsite, um den temporären Authentifizierungscode (kombiniert mit dem Benutzernamen) zu erkennen und die Authentifizierungscookies zu generieren, die bei einer normalen Anmeldung erstellt würden.

Als Ergebnis wird das Anmelde-Cookie im Browser des Clients für die Unterwebsite wie gewünscht festgelegt. :-)

1
majick