web-dev-qa-db-ja.com

あるWordpress Webサイトから別のWordpress Webサイトにログインします。

私のクライアントは、明示的に「マルチサイト」のワードプレスオプションを使用したくありません。
私のクライアントにはメインサイトと199のサブサイト(他のドメイン)があります。
ユーザーは、メタキーがusermetaで、branch_idです。

例として(完全に名前を作った):
メインサイト:kero.com
サブサイト: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 );

それで私はあらゆる種類のものを構築します、私は//ここで起こる魔法でこのリンクを使いました: ここをクリックしてください。

意図したとおりには機能しません。メインのWebサイトには表示されますが、[store]をクリックするとサブサイトに表示されます。私のアカウント(私がログインしているはずの場所)に行くと、もうログインしていません。

私は他のコードを書きました:

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

私は個人的な目的のためにこれを使用する方法を本当に知りません。結果をエコーすることはできますが、大量のヘッダーなどを取得することができます。サブサイトにアクセスすると、ログインしていません。

TBH:私は本当にセッション全体、クッキー、セキュリティに関して初心者です。ほとんどの場合、私はWordpressまたはLaravelで構築していますが、ほとんどのセキュリティ関連要素はすでに処理されています。

これを読むのに時間をかけている皆に感謝します。

更新:追加のcUrlコードを追加しました!

4
Dennis86

今後の参考のために、私は自分の質問に答えています。免責事項:これはフリーランスのギグであり、Xタイムフレームで行われなければなりませんでした。これは、これが最も早くかつ最も単純なオプションであることを意味します。

私がしたことは、

  1. プラグインをインストールしました https://wordpress.org/plugins/user-session-synchronizer/ - この男にクレジットを付けて、このプラグインはめちゃくちゃ良いです。それが無料であるという非常識な事実に加えて...
  2. 私はwp_loadedフックにフックして、ユーザーがどのブランチIDを持っているのかチェックしました。私が書いたプラグインにはブランチIDとURLのオプションがありました。ユーザーがどのブランチIDを持っているかを確認した後、どのURLがそのブランチIDに対応しているかを確認しました。

それからエコーした

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

サイトBに適用されるサイトAからのCookieの設定はできません。そのため、「プロキシによるログイン」スキームは機能せず、機能させることもできません。さらに、パスワードをプレーンテキストで保存することは、単なる大きな不可能です。

1
Mark Kaplun

私はそれが 可能である このような何かをすることによってそれを安全にすることになると思います:

  1. 認証フィルタ内で、行っているとおりにCURL要求を送信します。ユーザー名/パスワードは、サイトとサブサイトの間で一致(同期)されている必要があります。
  2. サブサイトにログインしたら、2番目のCURL要求をサブサイトに送信して、一時認証トークン(サブサイトのカスタムコードによって生成されたもの)を取得します。
  3. 元のサイトページ(ログイン後にリダイレクトされたもの)にiframeを置きます。iframe srcをサブサイトに設定し、一時コード(およびユーザー名)をクエリ文字列で送信します。 (あるいは、同じURLでサブサイトにリダイレクトするだけです。)
  4. サブサイトに一時的な認証コード(ユーザー名と組み合わせて)を認識し、通常のログインで作成される認証Cookieを生成するためのカスタムコードを用意します。

結果として、ログインCookieはサブサイトのクライアントのブラウザに必要に応じて設定されます。 :-)

1
majick