Установка доступного для сценария истечения срока действия cookie на основе wordpress_logged_in_ # cookie - PullRequest
0 голосов
/ 19 мая 2019

Мне нужен файл cookie для корректного отображения динамических ссылок для зарегистрированных / анонимных пользователей на кэшированных страницах. Я подумал, что с истечением срока действия файлов cookie для входа в WordPress по умолчанию, равным 14 дням, я не ошибаюсь при создании своего настраиваемого файла cookie, доступного по сценарию окончания срока действия в 14 дней, и это должно привести к их дате окончания синхронизации:

add_action('wp_login', 'lal_login');
function lal_login() {
    $expiration = time() + 14*24*60*60;
    setcookie('wp_user_logged_in', 1, $expiration, '/');
    $_COOKIE['wp_user_logged_in'] = 1;
}

add_action('wp_logout', 'lal_logout');
function lal_logout() {
    unset($_COOKIE['wp_user_logged_in']);
    setcookie('wp_user_logged_in', null, -1, '/');
}

К сожалению, Chrome показал, что срок годности 2 файлов cookie по умолчанию и мой пользовательский файл cookie не совпадают. Срок действия файлов cookie по умолчанию истекает через 12 часов.

wordpress_logged_in _ #

Создан Воскресенье, 19 мая 2019 года в 15:01:54 Истекает Понедельник, 3 июня 2019 года в 3:01:54

wordpress_sec _ #

Создан Воскресенье, 19 мая 2019 года в 15:01:54 Истекает Понедельник, 3 июня 2019 года в 3:01:54

wp_user_logged_in

Создан Воскресенье, 19 мая 2019 года в 15:01:54 Истекает Воскресенье, 2 июня 2019 года в 15:01:54

Я обнаружил, что WordPress добавляет 12-часовой «льготный период».

$expire = $expiration + ( 12 * HOUR_IN_SECONDS );

Должен ли я просто сделать срок действия файлов cookie через 14 дней 12 часов? Я также предпочел бы, чтобы истечение срока действия основывалось на куки-файле auth, который может меняться в зависимости от фильтра, а не на жестко заданном времени. Как мне этого добиться? В строке ниже показано, как рассчитывается срок действия файла cookie:

$expiration = time() + apply_filters( 'auth_cookie_expiration', 14 * DAY_IN_SECONDS, $user_id, $remember );

Я вижу, что WordPress также поддерживает установку, чтобы не помнить пользователя, хотя у меня есть проблемы с его пониманием, потому что код устанавливает $expire в 0 в следующей строке. Как я могу поддержать поле, чтобы помнить, что пользователь не отмечен правильно в моем файле cookie, чтобы отразить файл cookie аутентификации WordPress?

Целая функция, отвечающая за установку файла cookie для аутентификации, расположенная в pluggable.php, выглядит следующим образом:

function wp_set_auth_cookie( $user_id, $remember = false, $secure = '', $token = '' ) {
        if ( $remember ) {
            /**
             * Filters the duration of the authentication cookie expiration period.
             *
             * @since 2.8.0
             *
             * @param int  $length   Duration of the expiration period in seconds.
             * @param int  $user_id  User ID.
             * @param bool $remember Whether to remember the user login. Default false.
             */
            $expiration = time() + apply_filters( 'auth_cookie_expiration', 14 * DAY_IN_SECONDS, $user_id, $remember );

            /*
             * Ensure the browser will continue to send the cookie after the expiration time is reached.
             * Needed for the login grace period in wp_validate_auth_cookie().
             */
            $expire = $expiration + ( 12 * HOUR_IN_SECONDS );
        } else {
            /** This filter is documented in wp-includes/pluggable.php */
            $expiration = time() + apply_filters( 'auth_cookie_expiration', 2 * DAY_IN_SECONDS, $user_id, $remember );
            $expire     = 0;
        }

        if ( '' === $secure ) {
            $secure = is_ssl();
        }

        // Front-end cookie is secure when the auth cookie is secure and the site's home URL is forced HTTPS.
        $secure_logged_in_cookie = $secure && 'https' === parse_url( get_option( 'home' ), PHP_URL_SCHEME );

        /**
         * Filters whether the connection is secure.
         *
         * @since 3.1.0
         *
         * @param bool $secure  Whether the connection is secure.
         * @param int  $user_id User ID.
         */
        $secure = apply_filters( 'secure_auth_cookie', $secure, $user_id );

        /**
         * Filters whether to use a secure cookie when logged-in.
         *
         * @since 3.1.0
         *
         * @param bool $secure_logged_in_cookie Whether to use a secure cookie when logged-in.
         * @param int  $user_id                 User ID.
         * @param bool $secure                  Whether the connection is secure.
         */
        $secure_logged_in_cookie = apply_filters( 'secure_logged_in_cookie', $secure_logged_in_cookie, $user_id, $secure );

        if ( $secure ) {
            $auth_cookie_name = SECURE_AUTH_COOKIE;
            $scheme           = 'secure_auth';
        } else {
            $auth_cookie_name = AUTH_COOKIE;
            $scheme           = 'auth';
        }

        if ( '' === $token ) {
            $manager = WP_Session_Tokens::get_instance( $user_id );
            $token   = $manager->create( $expiration );
        }

        $auth_cookie      = wp_generate_auth_cookie( $user_id, $expiration, $scheme, $token );
        $logged_in_cookie = wp_generate_auth_cookie( $user_id, $expiration, 'logged_in', $token );

        /**
         * Fires immediately before the authentication cookie is set.
         *
         * @since 2.5.0
         * @since 4.9.0 The `$token` parameter was added.
         *
         * @param string $auth_cookie Authentication cookie value.
         * @param int    $expire      The time the login grace period expires as a UNIX timestamp.
         *                            Default is 12 hours past the cookie's expiration time.
         * @param int    $expiration  The time when the authentication cookie expires as a UNIX timestamp.
         *                            Default is 14 days from now.
         * @param int    $user_id     User ID.
         * @param string $scheme      Authentication scheme. Values include 'auth' or 'secure_auth'.
         * @param string $token       User's session token to use for this cookie.
         */
        do_action( 'set_auth_cookie', $auth_cookie, $expire, $expiration, $user_id, $scheme, $token );

        /**
         * Fires immediately before the logged-in authentication cookie is set.
         *
         * @since 2.6.0
         * @since 4.9.0 The `$token` parameter was added.
         *
         * @param string $logged_in_cookie The logged-in cookie value.
         * @param int    $expire           The time the login grace period expires as a UNIX timestamp.
         *                                 Default is 12 hours past the cookie's expiration time.
         * @param int    $expiration       The time when the logged-in authentication cookie expires as a UNIX timestamp.
         *                                 Default is 14 days from now.
         * @param int    $user_id          User ID.
         * @param string $scheme           Authentication scheme. Default 'logged_in'.
         * @param string $token            User's session token to use for this cookie.
         */
        do_action( 'set_logged_in_cookie', $logged_in_cookie, $expire, $expiration, $user_id, 'logged_in', $token );

        /**
         * Allows preventing auth cookies from actually being sent to the client.
         *
         * @since 4.7.4
         *
         * @param bool $send Whether to send auth cookies to the client.
         */
        if ( ! apply_filters( 'send_auth_cookies', true ) ) {
            return;
        }

        setcookie( $auth_cookie_name, $auth_cookie, $expire, PLUGINS_COOKIE_PATH, COOKIE_DOMAIN, $secure, true );
        setcookie( $auth_cookie_name, $auth_cookie, $expire, ADMIN_COOKIE_PATH, COOKIE_DOMAIN, $secure, true );
        setcookie( LOGGED_IN_COOKIE, $logged_in_cookie, $expire, COOKIEPATH, COOKIE_DOMAIN, $secure_logged_in_cookie, true );
        if ( COOKIEPATH != SITECOOKIEPATH ) {
            setcookie( LOGGED_IN_COOKIE, $logged_in_cookie, $expire, SITECOOKIEPATH, COOKIE_DOMAIN, $secure_logged_in_cookie, true );
        }
    }

1 Ответ

1 голос
/ 22 мая 2019

Я думаю, что проблема в основном в истечении срока действия куки, поэтому:

Я вижу, что WordPress также поддерживает установку не запоминать пользователя, хотя у меня проблемы с пониманием, потому что кодовые наборы $expireв следующей строке до 0.

Когда вы вызываете setcookie(), параметр expires должен быть либо опущен, либо установлен на 0, что в любом случае означает, чтосрок действия файла cookie истекает в конце сеанса (когда браузер закрывается).Вот почему WordPress нужно установить его в 0, когда пользователь не установил флажок «Запомнить меня» при входе в систему.

Как я могу поддерживать поле, чтобы помнить, что пользователь не отмечен правильно в моем файле cookie, чтобы отразить cookie-файл WordPress для аутентификации?

Вместо того, чтобы «поддерживать его», вы можете использовать хук set_logged_in_cookie, чтобы фактически установить ваш cookie-файл.Таким образом, вы получите ожидаемое время истечения, независимо от того, установлен пользователь или нет флажок «Запомнить меня».

Итак, код:

  1. Вместо этого: add_action('wp_login', 'lal_login');

    Использование: add_action('set_logged_in_cookie', 'lal_login', 10, 2);

    Или это : add_action('set_auth_cookie', 'lal_login', 10, 2);

  2. И lal_login():

    function lal_login( $cookie, $expire ) {
        // If the user didn't check the "Remember Me" checkbox, $expire would be 0.
        // So if you want, you can set $expire to 14 days, 2 days, etc.
        //$expire = $expire ? $expire : time() + 14 * DAY_IN_SECONDS;
    
        setcookie('wp_user_logged_in', 1, $expire, '/');
        $_COOKIE['wp_user_logged_in'] = 1;
    }
    

    Примечание. Если вы подключитесь к set_logged_in_cookie, $cookie будет значением файла cookie, зарегистрированным в системе;если вы подключитесь к set_auth_cookie, $cookie будет значением файла cookie аутентификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...