WordPress: одновременный логин для HTTP и HTTPS

Простое решение для POST на SSL URL

В , начиная с версии 2.6, встроена поддержка : можно сделать либо -логин, либо поместить панель администратора за . Однако, из-за особенностей реализации, когда пользователь входит в систему, он получает cookie либо для HTTP, либо для HTTPS. Иными словами, если пользователь попал на http://example.com/wp-admin/, то при переходе на https://example.com/wp-admin/ ему придётся входить в систему еще раз.

Всё бы ничего, но если плагин делает POST на HTTPS, то пользователь попадает на wp-login., который после успешного входа сделает перенаправление (GET) на URL, который ожидает принять POST. При этом если POST шёл на https://example.com/wp-admin/admin.php?page=somepage&noheader=1, то пользователь увидит безобразную страницу.

К счастью, есть простое решение. Как известно, аутентификационные cookies устанавливает процедура wp_set_auth_cookie. Перед их установкой она генерирует событие set_auth_cookie, которому передаются следующие параметры:

  • $auth_cookie — значение для cookie, сгенерированное процедурой wp_generate_auth_cookie();
  • $expire — 0, если пользователь не выбрал "Запомнить меня", не 0 в противном случае;
  • $expiration — срок жизни cookie;
  • $user_id — ID пользователя (из таблицы wp_users);
  • $scheme — схема аутентификации: secure_auth для SSL, auth для HTTP.

Использовать эти данные можно следующим образом:

[-]
View Code PHP
/**
 * set_auth_cookie action hook
 *
 * @param string $auth_cookie   Value generated by wp_generate_auth_cookie()
 * @param int $expire           0, if Remember Me is not checked
 * @param int $expiration       Cookie expiration date
 * @param int $user_id          ID of the logged in usger
 * @param string $scheme        Authentication scheme (secure_auth or auth)
 */

function sj_set_auth_cookie($auth_cookie, $expire, $expiration, $user_id, $scheme)
{
    static $was_here = false;

    if (false === $was_here) {
        $was_here = true;
        if ('secure_auth' == $scheme) {
            wp_set_auth_cookie($user_id, 0 != $expire, false);
        }
        elseif ('auth' == $scheme) {
            wp_set_auth_cookie($user_id, 0 != $expire, true);
        }
        else {
            $was_here = false;
        }
    }
}

add_action('set_auth_cookie', 'sj_set_auth_cookie', -100, 5);
Автор: ; опубликовано в: Советы; метки: HTTPS, PHP, SSL, WordPress, советы
17
Янв
2009

RSS Комментарии к статье «WordPress: одновременный логин для HTTP и HTTPS» (2)  »

  1. интересное решение. но для тех, кто не программер. куда этот кусок кода надо вставить чтобы все заработало?
    как я понимаю, тогда можно будет админу логиниться и работать по https:// да?

    • Если я правильно понимаю Ваши намерения, то Вам нужно добавить

      [-]
      View Code PHP
      define('FORCE_SSL_ADMIN', false);
      define('FORCE_SSL_LOGIN', false);

      в wp-config.php.

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

Оставить комментарий к записи «WordPress: одновременный логин для HTTP и HTTPS»

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя

गते गते पारगते पारसंगते बोधि स्वाहा