从一个WordPress网站登录到另一个WordPress网站

时间:2017-12-16 作者:Dennis86

我的客户明确表示不想使用“多站点”wordpress选项
我的客户有一个主站点和199个子站点(其他域)
用户具有元键为branch\\u id的usermeta

例如(完全虚构的名称):
主要站点:kero。子站点:uka。com(和许多其他公司)

两个域都有SSL证书。

最终目标如下:当您登录到主站点(kero.com)时。我已经构建了一个插件来检查哪个分支ID附加到用户。它是这样的:

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 );
所以我构建了各种各样的东西,我在//magic ockes here上使用了这个链接:Click here.

它没有按预期工作。它让我保持在主网站上,但当我点击“商店”时,它就在子网站上。当我转到我的帐户(我应该登录的地方)时,我不再登录了。

我写了一些其他代码:

$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()
        )
    );
我真的不知道如何将此用于我的个人目标。我可以回显结果,但随后会得到大量标题等。当我浏览子网站时:我没有登录。。。所以它不能保存会话/cookie。

TBH:我对整个会话/cookie/安全方面的东西都是初学者。大多数时候,我在Wordpress或Laravel中构建,大多数安全性方面的东西都已经处理好了。

感谢所有花时间阅读本文的人。

UPDATE: Added extra cUrl code!

3 个回复
最合适的回答,由SO网友:Dennis86 整理而成

为了将来的参考,我回答我自己的问题。免责声明:这是一场自由职业演出,必须在X时间范围内完成。这意味着这是最快、最简单的选择。

我所做的是:

已安装插件https://wordpress.org/plugins/user-session-synchronizer/ - 给这家伙一些信任,这个插件非常好。除了免费的疯狂事实之外然后回显

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

SO网友:Mark Kaplun

您不能从站点A设置适用于站点B的Cookie,因此您的“代理登录”方案将不起作用,也无法使其发挥作用。此外,明文存储密码也是一个大禁忌。

SO网友:majick

我认为这样做是有可能安全的:

在authenticate过滤器中,按您的操作发送CURL请求。用户名/密码必须在站点和子站点之间匹配(同步)src 设置为子网站,并在查询字符串中发送临时代码(和用户名)。(或者只重定向到具有相同URL的子网站。)最终结果,将根据需要在客户端浏览器中为子网站设置登录cookie。:-)

结束