web-dev-qa-db-fra.com

Connectez-vous d'un site WordPress à un autre site WordPress

Mon client ne veut pas explicitement utiliser l’option wordpress "multisite".
Mon client a un site principal et 199 sous-sites (autres domaines).
Un utilisateur a usermeta avec la clé méta: branch_id

À titre d'exemple (noms entièrement composés):
Site principal: kero.com
Sous-site: uka.com (et beaucoup d’autres)

Les deux domaines ont des certificats SSL.

L’objectif final est le suivant: Lorsque vous vous connectez au site principal (kero.com). J'ai construit un plugin qui vérifie quel ID de branche est attaché à l'utilisateur. Ça va comme ça:

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 );

Donc, je construis toutes sortes de choses, j'ai utilisé ce lien sur // la magie se passe ici: Cliquez ici.

Cela ne fonctionne pas comme prévu. Cela me permet de rester sur le site principal, mais lorsque je clique sur "magasin", il se trouve dans le sous-site. Quand je vais sur mon compte (où je devrais être connecté), je ne suis plus connecté.

J'ai écrit un autre code:

$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()
        )
    );

Je ne sais pas vraiment comment utiliser cela pour mon objectif personnel. Je peux faire écho aux résultats, mais puis obtenir un grand nombre d'en-têtes, etc. Et quand je surfe sur le sous-site: je ne suis pas connecté ... Il ne conserve donc pas de sessions/cookies.

TBH: Je suis vraiment un débutant sur toute la session/cookie/sécurité. La plupart du temps, j'utilise Wordpress ou Laravel et la plupart des problèmes de sécurité sont déjà gérés.

Merci à tous ceux qui prennent le temps de lire ceci.

UPDATE: ajout d'un code supplémentaire!

4
Dennis86

Pour référence future, je réponds à ma propre question. Clause de non-responsabilité: Il s’agissait d’un travail indépendant et devait être fait dans un laps de temps X. Ce qui signifie que c'était l'option la plus rapide ET la plus simple.

Ce que j'ai fait était:

  1. Installé le plugin https://wordpress.org/plugins/user-session-synchronizer/ - Donne un crédit à ce gars, ce plugin est incroyablement bon. Outre le fait fou que c'est GRATUIT ...
  2. J'ai accroché sur le hook wp_loaded et vérifié quel ID de branche avait l'utilisateur; Le plugin que j'ai écrit avait des options avec les identifiants de branche et les urls. C'est donc après avoir vérifié quel identifiant de branche l'utilisateur avait: il a vérifié quelle URL correspondait à l'identifiant de branche.

Puis fait écho

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

Vous ne pouvez pas définir de cookies sur le site A qui s’appliqueront sur le site B; votre système de "connexion par proxy" ne fonctionnera donc pas et ne pourra pas fonctionner. De plus, stocker des mots de passe en texte brut est un gros no-no.

1
Mark Kaplun

Je pense qu'il serait possible de le faire en toute sécurité en faisant quelque chose comme ceci:

  1. Dans le filtre d'authentification, envoyez la demande CURL comme vous le faites. Le nom d'utilisateur/mot de passe doit correspondre (être synchronisé) entre le site et le sous-site.
  2. Maintenant connecté au sous-site, envoyez une deuxième demande CURL au sous-site pour obtenir un jeton d'authentification temporaire (généré par un code personnalisé sur le sous-site.)
  3. Placez une iframe sur la page de site d'origine (celle redirigée après la connexion) ... avec iframe src défini sur le sous-site, avec le code temporaire (et le nom d'utilisateur) envoyé dans la chaîne de requête. (Vous pouvez également rediriger vers le sous-site avec la même URL.)
  4. Ayez un code personnalisé sur le sous-site pour reconnaître le code d'authentification temporaire (associé au nom d'utilisateur) et générer les cookies d'authentification qui seraient créés lors d'une connexion normale.

En fin de compte, le cookie de connexion est défini dans le navigateur du client pour le sous-site souhaité. :-)

1
majick