+7(982) 597-7179

Одна авторизация на два сайта

Задался сегодня этим вопросом. Оказывается не все так просто как хотелось. Поисковики все кидают меня на тему: “Авторизация с помощью социальных сетей”. Авторизация с помощью сетей, конечно нормально, но это не то, что нам бы хотелось.

Задача стоит следующего плана: Сделать регистрацию пользователя на сайте и чтоб автоматически регистрировался на другом.

Зачем это нужно?

У меня есть сайт на wordpress. Грубо говоря информационный. Теперь появилась идея коммуникации с пользователями (клиентами), для этого был создан поддомен. Но пользователи, которые уже регистрировались на сайте, должны автоматом быть зарегены в поддомене. Вот тут вся соль. Как перенести сессию пользователя на другой сайт, при этом новые пользователи должны регистрироваться на обоих сайтах.

В общем тут просто.

Если сайты разных доменов (test.ru computy.ru) то есть открытая децентрализованная система OpenID

А если сайты поддоменов (tech.computy.ru service.computy.ru), то куку поставленную на домен computy.ru будет видно на всех поддоменах.

И так:

1. Убедитесь, что установленные WordPress находятся в одной доменной зоне.

Например, mysite.ru, mysite.ru/secondsite/ и sub.mysite.ru имеют один верхний домен.

2. Вам нужно объединить все сайты в одной базе данных.

Все базы сайтов объединяются в одну с установкой отличных префиксов, для этого в файле wp-config.phpподключаемых сайтов прописываются те же параметры, что и у основного сайта, но выбирается другой префикс.

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

/** Имя базы данных для WordPress */
define(‘DB_NAME’, ‘myDB’);
/** MySQL имя пользователя */
define(‘DB_USER’, ‘userDB’);
/** MySQL пароль базы данных */
define(‘DB_PASSWORD’, ‘password’);
/** MySQL сервер — иногда требуется изменять это значение. например на Мастерхосте */
define(‘DB_HOST’, ‘localhost’);
/** Кодировка базы данных, используемая при создании таблиц. */
define(‘DB_CHARSET’, ‘utf8′);
/** Сопоставление базы данных. НЕ ИЗМЕНЯЙТЕ ЭТО ЗНАЧЕНИЕ. */
define(‘DB_COLLATE’, »);
/**
* Префикс таблиц WordPress в базе данных.
*
* Вы можете иметь несколько инсталляций WordPress в одной базе, но поставив в каждой различные префиксы
* Только цифры, латинские буквы и символ подчеркивания!
*/
$table_prefix  = ‘wp_’;
то у подключаемых сайтов wp-config.php должен иметь вид:
/** Имя базы данных для WordPress */
define(‘DB_NAME’, ‘myDB’);
/** MySQL имя пользователя */
define(‘DB_USER’, ‘userDB’);
/** MySQL пароль базы данных */
define(‘DB_PASSWORD’, ‘password’);
/** MySQL сервер — иногда требуется изменять это значение. например на Мастерхосте */
define(‘DB_HOST’, ‘localhost’);
/** Кодировка базы данных, используемая при создании таблиц. */
define(‘DB_CHARSET’, ‘utf8′);
/** Сопоставление базы данных. НЕ ИЗМЕНЯЙТЕ ЭТО ЗНАЧЕНИЕ. */
define(‘DB_COLLATE’, »);
/**
* Префикс таблиц WordPress в базе данных.
*
* Вы можете иметь несколько инсталляций WordPress в одной базе, но поставив в каждой различные префиксы
* Только цифры, латинские буквы и символ подчеркивания!
*/
$table_prefix  = ‘second_’; //здесь вы указываете любой префикс для таблиц подключаемых сайтов, отличный от префикса таблиц основного
3. Установить общую таблицу пользователей всех сайтов.
Чтобы реализовать общую таблицу пользователей необходимо в файле wp-config.php подключаемых сайтов дописать 2 директивы. Пример составлен из расчета, что таблицы базы основного сайта имеют префикс wp_.
// устанавливаем единую таблицу пользователей
define(‘CUSTOM_USER_TABLE’, ‘wp_users’);
define(‘CUSTOM_USER_META_TABLE’, ‘wp_usermeta’);

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

Для этого нам нужен файл wp-includes/capabilities.php, в котором находится функция function _init_caps(). В теле функции меняем значение ключа:

!!!изменяем файлы только подключаемых сайтов

function _init_caps( $cap_key = » ) {
global $wpdb;
if ( empty($cap_key) )
$this->cap_key = $wpdb->prefix . ‘capabilities’; //Здесь меняем $wpdb->prefix . ‘capabilities’ на ‘wp_capabilities’
else
$this->cap_key = $cap_key;
$this->caps = &$this->{$this->cap_key};
if ( ! is_array( $this->caps ) )
$this->caps = array();
$this->get_role_caps();
}

В итоге должно получиться:
    function _init_caps( $cap_key = » ) {
    global $wpdb;
    if ( empty($cap_key) )
    $this->cap_key = ‘wp_capabilities’;
    else
    $this->cap_key = $cap_key;
    $this->caps = &$this->{$this->cap_key};
    if ( ! is_array( $this->caps ) )
    $this->caps = array();
    $this->get_role_caps();
    }

5. Устанавливаем домен и путь для cookie.

Домен и пути для cookie прописываются в wp-config.php ВСЕХ сайтов:

// устанавливаем домен и путь для куки
    define(‘COOKIE_DOMAIN’, ‘.mysite.ru’); //Перед именем домена обязательно ставьте точку! Это указание на область применения cookie
    define(‘COOKIEPATH’, ‘/’);

6. Прописываем уникальные ключи аутентификации, общие для ВСЕХ сайтов. Прописываются в wp-config.php ВСЕХ сайтов, для этого ищем в файле:
    /**#@+
    * Уникальные ключи аутентификации.
    *
    * Измените их на уникальные фразы! Каждая фраза должна быть разной. Желательно с использованием латинских строчных и прописных букв, цифр, спецсимоволов.
    * Или просто сгенерируйте, открыв вот эту ссылку в браузере {@link https://api.wordpress.org/secret-key/1.1/ WordPress.org secret-key service} . Затем скопируйте полученные строки ниже, заменив те что были до этого
    *
    * @since 2.6.0
    */
    define(‘AUTH_KEY’, ‘izmenite eto na unikalnuyu frazu’);
    define(‘SECURE_AUTH_KEY’, ‘izmenite eto na unikalnuyu frazu’);
    define(‘LOGGED_IN_KEY’, ‘izmenite eto na unikalnuyu frazu’);
    define(‘NONCE_KEY’, ‘izmenite eto na unikalnuyu frazu’);
    /**#@-*/
    и заменяем на:
    /**#@+
    * Уникальные ключи аутентификации.
    *
    * Измените их на уникальные фразы! Каждая фраза должна быть разной. Желательно с использованием латинских строчных и прописных букв, цифр, спецсимоволов.
    * Или просто сгенерируйте, открыв вот эту ссылку в браузере {@link https://api.wordpress.org/secret-key/1.1/ WordPress.org secret-key service} . Затем скопируйте полученные строки ниже, заменив те что были до этого
    *
    * @since 2.6.0
    */
    define(‘SECRET_KEY’,       ’111′); //Вместо единичек ’111′ укажите собственные значения ключей
    define(‘AUTH_KEY’,         ’111′); //Вместо единичек ’111′ укажите собственные значения ключей
    define(‘SECURE_AUTH_KEY’,  ’111′); //Вместо единичек ’111′ укажите собственные значения ключей
    define(‘LOGGED_IN_KEY’,    ’111′); //Вместо единичек ’111′ укажите собственные значения ключей
    define(‘AUTH_SALT’,        ’111′); //Вместо единичек ’111′ укажите собственные значения ключей
    define(‘LOGGED_IN_SALT’,   ’111′); //Вместо единичек ’111′ укажите собственные значения ключей
    /**#@-*/

7. Изменяем имена cookie.

В WordPress имя cookie образуется с помощью хэша от адреса WordPressa, при этом для автоматической авторизации имена cookie необходимо сделать одинаковыми, для чего в файле wp-config.php ВСЕХ сайтов, ниже прописаных ключей (п.6) устанавливаем свои имена:

    // изменяем имена куки
    $publick_hash = md5(‘http://mysite.ru’);
    define(‘USER_COOKIE’, ‘wordpressuser_’ . $publick_hash);
    define(‘PASS_COOKIE’, ‘wordpresspass_’ . $publick_hash);
    define(‘AUTH_COOKIE’, ‘wordpress_’ . $publick_hash);
    define(‘SECURE_AUTH_COOKIE’, ‘wordpress_sec_’ . $publick_hash);
    define(‘LOGGED_IN_COOKIE’, ‘wordpress_logged_in_’ . $publick_hash);
    define(‘TEST_COOKIE’, ‘wordpress_test_cookie_’ . $publick_hash);
    define( ‘ADMIN_COOKIE_PATH’, ‘/’ ); //Если не прописывать эту директиву, то пользователь не сможет зайти в админку
    define( ‘PLUGINS_COOKIE_PATH’, ‘/’ ); //Аналогично, но для плагинов
8. Радуемся

Приглашаем поучавствовать в обсуждении статьи:

Комментариев 0

Войти с помощью: