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

Всё бы ничего, но если плагин делает POST на HTTPS, то пользователь попадает на wp-login.php, который после успешного входа сделает перенаправление (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);
Добавить в закладки
  • del.ici.ous
  • Digg
  • Furl
  • Google
  • Simpy
  • Spurl
  • Y! MyWeb
  • БобрДобр
  • Мистер Вонг
  • Yandex.Закладки
  • Текст 2.0
  • News2
  • AddScoop
  • RuSpace
  • RUmarkz
  • Memori
  • Google Bookmarks
  • Писали
  • СМИ 2
  • Моё Место
  • 100 Закладок
  • Ваау!
  • Technorati
  • RuCity
  • LinkStore
  • NewsLand
  • Lopas
  • Закладки - IN.UA
  • Connotea
  • Bibsonomy
  • Trucking Bookmarks
  • Communizm
  • UCA
  • Slashdot
  • Magnolia
  • Blogmarks
  • Current
  • Meneame
  • Oknotizie
  • Diigo
  • Funp
  • Hugg
  • Dealspl.us
  • N4G
  • Mister Wong
  • Faves
  • Yigg
  • Fresqui
  • Care2
  • Kirtsy
  • Sphinn
  • SaveThis.ru

Связанные записи

17
Янв
2009

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

  1. trouble2maker says:

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

    • Vladimir says:

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

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

      в wp-config.php.

Подписаться на RSS-ленту комментариев к статье «WordPress: одновременный логин для HTTP и HTTPS» Trackback URL: http://blog.sjinks.org.ua/wordpress/tips-and-tricks/486-simultaneous-login-for-http-and-https/trackback/

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

Вы можете использовать данные тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

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

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