Faça login de um site do wordpress em outro site do wordpress

4

Meu cliente explicitamente não quer usar a opção wordpress 'multisite'.
Meu cliente tem um site principal e 199 sub sites (outros domínios).
Um usuário possui usermeta com meta key: branch_id

Como exemplo (nomes completamente inventados):
Site principal: kero.com
Subsite: uka.com (e muitos outros)

Ambos os domínios possuem certificados SSL.

O objetivo final é o seguinte: Quando você entra no site principal (kero.com). Eu construí um plugin que verifica qual ID de filial está anexado ao usuário. É assim:

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

Então eu construo todo tipo de coisa, eu usei este link na // mágica acontece aqui: Clique aqui.

Não funciona como desejado. Isso me mantém no site principal, mas quando clico em 'store' é no subsite. Quando eu vou para a minha conta (onde eu deveria estar logado) eu não estou mais logado.

Eu escrevi outro código:

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

Eu realmente não sei como usar isso para meu objetivo pessoal. Eu posso ecoar os resultados, mas depois obter uma grande variedade de cabeçalhos etc. E quando eu navego para o subsite: Eu não estou logado ... Então ele simplesmente não mantém sessões / cookies.

TBH: Eu sou realmente um iniciante em toda a sessão / cookie / segurança. A maior parte do tempo eu construo no Wordpress ou no Laravel e a maioria das coisas de segurança já são tratadas.

Obrigado a todos que estão dedicando tempo para ler isso.

UPDATE: Adicionado código extra da cUrl!

    
por Dennis86 16.12.2017 / 18:25

3 respostas

0

Para referência futura, estou respondendo a minha própria pergunta. Disclaimer: Este foi um show freelance e teve que ser feito em um período de tempo X. O que significa que esta foi a opção mais rápida e simples.

O que eu fiz foi:

  1. Instalado o plugin enlace - Dê a esse cara algum crédito, este plugin é insanamente bom. Além do fato insano de que é GRÁTIS ...
  2. Conectei-me ao gancho wp_loaded e verifiquei qual ID de filial o usuário tinha; O plugin que eu escrevi tinha opções com IDs de agência e URLs. Então, depois de verificar qual ID de filial o usuário tinha: ele verificou qual URL correspondia ao ID da filial.

Em seguida, echo'd

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

Você não pode definir o site de formulário de cookies A que será aplicável no site B, portanto, o seu esquema de "login por proxy" não funcionará e não poderá funcionar. Além disso, armazenar senhas em texto simples é apenas um grande não-não.

    
por Mark Kaplun 17.12.2017 / 16:12
1

Acho que seria possível fazer isso com segurança, fazendo algo assim:

  1. Dentro do filtro de autenticação, envie a solicitação CURL como você está fazendo. O nome de usuário / senha teria que corresponder (ser sincronizado) entre o site e o subsite.
  2. Agora, conectado ao subsite, envie uma segunda solicitação CURL ao subsite para obter um token de autenticação temporário (gerado pelo código personalizado no subsite).
  3. Coloque um iframe na página do site original (aquela redirecionada após o login) ... com o iframe src definido para o subsite, com o código temporário (e o nome de usuário) enviado na string de consulta. (Alternativamente, basta redirecionar para o subsite com o mesmo URL).
  4. Tenha um código personalizado no subsite para reconhecer o código de autenticação temporário (combinado com o nome de usuário) e gerar os cookies de autenticação que seriam feitos em um login normal.

Resultado final, o cookie de login é definido no navegador do cliente para o subsite, conforme desejado. : -)

    
por majick 19.12.2017 / 11:31