web-dev-qa-db-ja.com

マッピング付きネットワーク上の複数ドメインにわたるログインCookie

私は50以上のサイトを持つサブディレクトリWordpressネットワークを持っています、それはwordpress.example.comのプライマリドメインにあります。

私のネットワーク内のクライアント johndoe は、(意図的に)メインブランドを含むバックエンドを持ちます(ブランド化と所有権の理由から)。

wordpress.example.com/johndoe/wp-admin/

その後、 を使用したドメインマッピングを介してWordPress MU Domain Mapping By Donncha O Caoimh 、のフロントエンド:

johndoe.com/


私の問題は、ログインCookieはwordpress.example.comにのみ関連付けられ、完全に無関係でjohndoe.comを認識しないため、フロントエンドがユーザーが実際にログインしていることを認識しないことです。

  • フロントエンドにユーザーツールバーがない
  • 「変更をプレビューする」ボタンが機能しない
  • is_user_logged_in()はフロントエンドでは動作しません
  • フロントエンドページビルダープラグインが機能しない

「リモートログイン」を無効にすることで、サイトのバックエンドをjohndoe.com/wp-admin/にすることができ、前述の問題をすべて解決できます。ただし、バックエンド用にプライマリドメインを維持することが重要です。すべての私の読みで私は解決策を見つけていない、そして私はこの質問を何年もの間放置させた。

私はWordpress.com(それ自体がWordpressネットワークを搭載)がこの問題を解決したようです。 https://longitudes.ups.comのようなランダムなwordpress.comブログにベンチャーしてwordpress.comにログインしたとき 私は自分の.comログインを見ることができ、ツールバーはiframeのように見えません。愚かなことは何でも。

それで、私の質問は、Wordpressサイトのフロントエンドドメインがバックエンドと異なるならば、ログインクッキーを両方に結び付ける方法はありますか?答えが「あなたができない」(私のすべての研究が戻ってきたように)なら、私のフォローアップはそうです、まあAutomatticの人々はどうやってそれをしますか?

1
David Sword

WordPressはAUTH_COOKIELOGGED_IN_COOKIEをチェックすることによってあなたがログインしているかどうかを決定しています。あなたはこれらのクッキーが同じように設定されていることに気づいたように、あなたのサイトが何であるかAドメインを言ってみましょう。 2番目のBドメインに同じCookieを追加すると、ユーザーは2つのAドメインとBドメインにログインします。もちろん、2番目のAドメインにドメインBからcookieを設定することは、非常に大きなセキュリティ上の欠陥となるため、ドメインAからドメインBにcookie値を送信し、それらをdomain Bに設定する必要があります。

それで、これは我々がしなければならないことです:

  • ドメインAのクッキーAUTH_COOKIELOGGED_IN_COOKIEを読む
  • cookie AUTH_COOKIELOGGED_IN_COOKIEをドメインAからドメインBに送信する
  • ドメインBにクッキーAUTH_COOKIELOGGED_IN_COOKIEを設定する

クッキーを読むには、2つのフィルタset_auth_cookieset_logged_in_cookieを使う必要があります。ドメインBユーザーのブラウザにクッキーを設定するには、ブラウザはサイトB上にある必要があります。そのため、クッキー値を使用してユーザーをドメインAからドメインBにリダイレクトする必要があります。 GET paramsを使用したリダイレクトはオプションではありません。クッキーはセキュリティに注意を払う必要があります。POSTリクエストを使用する必要があります。ユーザーをリダイレクトし、POSTを使用してCookieデータを送信するには、ドメインBを指すURLを使用して単純なHTMLフォームを作成します。ユーザーがリダイレクトされたら、ドメインBにCookieを設定し、ユーザーをドメインAに戻すことができます。

私は自分の実装用に作業コードを作成しました。

/**
 * DOMAIN A PART PLUGIN
 */

class WPSE_287556_Send_Cookies {

    /**
     * Domain which user have to be redirected
     *
     * @var array
     */
    private $domainB = 'example.com';

    /**
     * Array of cookies to send
     *
     * @var array
     */
    private $cookies = array();

    /**
     * WPSE_287556_Send_Cookies constructor.
     */
    public function __construct()
    {
        /**
         * Define plugin related hooks
         */
        $this->define_hooks();
    }

    /**
     * Save auth and logged in cookies to array
     */
    public function save_cookie( $cookie, $expire, $expiration, $user_id, $scheme, $token ) {

        $this->cookies[] = $data = array(
            'cookie' => $cookie,
            'expire' => $expire,
            'scheme' => $scheme,
        );
    }

    /**
     * Display redirect post form
     *
     * We should not redirect user with cookies in get parameters because this is
     * no safe. We also can not redirect user with post parameters. We can create
     * html post form and submit it with js.
     */
    public function display_redirect_form( $redirect_to, $requested_redirect_to, $user ) {

        if( is_array( $this->cookies ) && !empty( $this->cookies ) ):

            $url = ( is_ssl() ) ? 'https://' : 'http://' . $this->domainB . '/';
            ?>

            <form action="<?php echo esc_url( $url ); ?>" method="post" style="display: none;" id="post_redirect_form">

                <input type="hidden" name="action" value="set_cookies" >

                <?php foreach($this->cookies as $index => $cookie): ?>
                    <input type="hidden" name="cookies[<?php esc_attr_e( $index ); ?>][cookie]" value="<?php esc_attr_e( $cookie['cookie'] ); ?>" >
                    <input type="hidden" name="cookies[<?php esc_attr_e( $index ); ?>][expire]" value="<?php esc_attr_e( $cookie['expire'] ); ?>" >
                    <input type="hidden" name="cookies[<?php esc_attr_e( $index ); ?>][scheme]" value="<?php esc_attr_e( $cookie['scheme'] ); ?>" >
                <?php endforeach; ?>

                <input type="hidden" name="redirect_to" value="<?php esc_attr_e( $redirect_to ); ?>" >
            </form>
            <script> document.getElementById('post_redirect_form').submit(); </script>

            <?php exit; ?>

        <?php endif;

        return $redirect_to;
    }

    /**
     * Define plugin related hooks
     */
    private function define_hooks() {

        /**
         * Save cookies hook
         */
        add_action( 'set_auth_cookie', array($this, 'save_cookie'), 10, 6 );
        add_action( 'set_logged_in_cookie', array($this, 'save_cookie'), 10, 6 );

        /**
         * Display redirect post form
         *
         * This filter is used to modify redirect url after login. There is no
         * better place to modify page content after user login. Additionally
         * we have access to $redirect_to url which we can use later.
         */
        add_filter('login_redirect', array( $this, 'display_redirect_form' ), 10, 3);
    }
}

new WPSE_287556_Send_Cookies();

/**
 * END OF DOMAIN A PART PLUGIN
 */

/**
 * DOMAIN B PART PLUGIN
 */

class WPSE_287556_Set_Cookies {

    /**
     * WPSE_287556_Set_Cookies constructor.
     */
    public function __construct()
    {
        /**
         * Define plugin related hooks
         */
        $this->define_hooks();
    }

    /**
     * Set auth and logged in cookies
     */
    public function set_cookies() {

        // Check if request is "set auth cookie" request
        if( $_SERVER['REQUEST_METHOD'] === 'POST' && isset( $_POST['action'] ) && $_POST['action'] === 'set_cookies' ) {

            $args = array(
                'redirect_to'   => FILTER_SANITIZE_URL,
                'cookies'    => array(
                    'filter' => FILTER_SANITIZE_STRING,
                    'flags'  => FILTER_REQUIRE_ARRAY,
                ),
            );

            // Read and filter all post params
            $post = filter_input_array(INPUT_POST, $args);

            $redirect_to = $post['redirect_to'];
            $cookies     = $post['cookies'];

            foreach( $cookies as $cookie_params ){

                $scheme = $cookie_params['scheme'];
                $cookie = $cookie_params['cookie'];
                $expire = (int) $cookie_params['expire'];

                // Decide which cookie to set
                switch( $scheme ) {

                    case 'logged_in':

                        // Set logged in cookie, most of the code is from wp_set_auth_cookie function
                        setcookie( LOGGED_IN_COOKIE, $cookie, $expire, COOKIEPATH, COOKIE_DOMAIN, is_ssl(), true);

                        if ( COOKIEPATH != SITECOOKIEPATH )
                            setcookie(LOGGED_IN_COOKIE, $cookie, $expire, SITECOOKIEPATH, COOKIE_DOMAIN, is_ssl(), true);

                        break;

                    case 'secure_auth':
                    case 'auth':

                        // Set auth cookie, most of the code is from wp_set_auth_cookie function
                        if ( $scheme === 'secure_auth' ) {
                            $auth_cookie_name = SECURE_AUTH_COOKIE;
                        } else {
                            $auth_cookie_name = AUTH_COOKIE;
                        }

                        setcookie($auth_cookie_name, $cookie, $expire, PLUGINS_COOKIE_PATH, COOKIE_DOMAIN, is_ssl(), true);
                        setcookie($auth_cookie_name, $cookie, $expire, ADMIN_COOKIE_PATH, COOKIE_DOMAIN, is_ssl(), true);

                        break;
                }
            }

            // Redirect user to previous site
            header( 'Location: ' . esc_url( $redirect_to ) );
            exit;
        }
    }

    /**
     * Define plugin related hooks
     */
    private function define_hooks() {

        /**
         * Set cookies from request
         */
        add_action( 'init', array($this, 'set_cookies'));
    }
}

new WPSE_287556_Set_Cookies();

/**
 * END OF DOMAIN B PART PLUGIN
 */
1
kierzniak

あなたのwp-config.phpファイルでこの定義をチェックしてもらえますか?

define('ADMIN_COOKIE_PATH', '/');
define('COOKIE_DOMAIN', '');
define('COOKIEPATH', '');
define('SITECOOKIEPATH', ''); 

また、マルチサイトの定義も確認してください。

define('WP_ALLOW_MULTISITE', true);
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', false);
define('DOMAIN_CURRENT_SITE', 'your-domain.com');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);
define('SUNRISE', 'on');
0
Serkan Algur