Мультисайтинг - как добиться, чтобы пользователи переходили с сайта на сайт без авторизации на каждом?

Главные вкладки

Аватар пользователя AnNik AnNik 26 декабря 2009 в 8:16

Собственно сабж...

Структура такая:
site.ru - основной сайт
sub.site.ru - поддомен основного сайта
site2.ru - второй сайт

Общие таблицы:
"access"
"authmap"
"filters"
"filter_formats"
"languages"
"locales_source"
"locales_target"
"permission"
"pm_block_user"
"pm_index"
"pm_message"
"pm_tags"
"pm_tags_index"
"profile_fields"
"profile_values"
"role"
"sessions"
"sequences"
"smileys"
"users"

При переходе с site.ru на sub.site.ru и обратно - никаких проблем, авторизовавшись на одном из сайтов, пользователь автоматически становится авторизован и на втором.
А вот чтобы то же самое работало при переходе с site.ru на site2.ru и обратно, никак не могу добиться...
$cookie_domain на втором сайте ставил и site.ru, и site2.ru, ни так, ни так не работает...
Подозреваю, что упустил в настройках site2.ru какую-то сущую мелочь, но что именно? Никак не соображу... Наведите плз на мыслю...

Комментарии

Аватар пользователя AnNik AnNik 26 декабря 2009 в 20:07

Посмотрел...
Еще один модуль ставить не хочется, но танцы с бубном над ini_set('session.name', 'mysite_PHPSESSID') и $cookie_domain пока ни к чему не привели...

Аватар пользователя VladSavitsky VladSavitsky 26 декабря 2009 в 23:47

Модуль Single SignOn делает как раз то, что вам нужно.
Но модуль только недавно сделан как замена прежнему Shared SignOn и не умеет работать с мультиязычными сайтами и некоторыми модулями, которые вмешиваются в процесс логина.

Аватар пользователя AnNik AnNik 27 декабря 2009 в 7:14

А multisite_login кто-нибудь пробовал?

...а вообще хотелось бы обойтись без доп.модулей, чую, что это возможно, никому не удавалось добиться полноценного мультисайтингового логина путем манипуляций над ini_set('session.name', 'mysite_PHPSESSID') и $cookie_domain?

Аватар пользователя VladSavitsky VladSavitsky 28 декабря 2009 в 20:57

"AnNik" wrote:
...а вообще хотелось бы обойтись без доп.модулей, чую, что это возможно, никому не удавалось добиться полноценного мультисайтингового логина путем манипуляций над ini_set('session.name', 'mysite_PHPSESSID') и $cookie_domain?

Ответ сам напрашивается. Если у других не получилось, то попробуйте сами. Я уверен, что всё друпал-сообщество захочет увидеть реализацию метода общих кукис.

Аватар пользователя AnNik AnNik 29 декабря 2009 в 13:55

"VladSavitsky" wrote:
Ответ сам напрашивается. Если у других не получилось, то попробуйте сами. Я уверен, что всё друпал-сообщество захочет увидеть реализацию метода общих кукис.

Уже 3 дня экспериментирую, больше правда методом тыка...
Клятвенно обещаю, что если получится, то решение выложу сюда обязательно.
И призываю друпал-сообщество вместе посоображать, хотя бы теоретически,:) что и как еще можно попробовать, еще где-то неделька или может даже две на эксперименты у меня есть...

Итак, что пробовал:
* $cookie_domain = 'site.ru' на первом сайте и 'site2.ru' на втором. Итог абсолютно предсказуем: пользователю приходится логиниться на обоих сайтах. Для каждого из сайтов в таблице sessions появляется своя запись.
* $cookie_domain = 'site.ru' на обоих сайтах. Логин на site.ru проходит без проблем, но на site2.ru пользователь остается неавторизованным. При логине на site2.ru вообще как будто ничего не происходит, пользователь остается незалогиненным ни на том, ни на другом сайте.

И для того, и для другого варианта $cookie_domain пробовал задавать ini_set('session.name', 'mysite_PHPSESSID') с одинаковыми 'mysite_PHPSESSID' и с разными. Вообще не заметил какого-то влияния этой установки на процесс логина пользователя ни на том, ни на другом сайте.

Кто что еще посоветует попробовать?

У меня пока созрел один конкретный вопрос:
1. 'mysite_PHPSESSID' - может есть какие-то конкретные требования к ней? Или тут допустимо любое произвольное значение? Может, я не заметил никакого ее влияния просто потому, что задавал ее как-то неправильно? До сих пор с php-сессиями на "программистском" уровне работать не приходилось, потому и мои познания в этой сфере соответствующие... Из копания в документации по пхп сделал вывод, что допустимо любое произвольное значение, но может я ошибаюсь? И, по логике, 'mysite_PHPSESSID' вроде как должна быть одной и той же на всех сайтах связки, но... тут опять же большой знак вопроса...

Аватар пользователя AnNik AnNik 30 декабря 2009 в 0:01

Немного теории...
Внимательно изучаем фрагмент функции conf_init() из bootstrap.inc

<?php
  
if ($cookie_domain) {
    
// If the user specifies the cookie domain, also use it for session name.
    
$session_name $cookie_domain;
  }
  else {
    
// Otherwise use $base_url as session name, without the protocol
    // to use the same session identifiers across http and https.
    
list( , $session_name) = explode('://'$base_url2);
    
// We escape the hostname because it can be modified by a visitor.
    
if (!empty($_SERVER['HTTP_HOST'])) {
      
$cookie_domain check_plain($_SERVER['HTTP_HOST']);
    }
  }
  
// To prevent session cookies from being hijacked, a user can configure the
  // SSL version of their website to only transfer session cookies via SSL by
  // using PHP's session.cookie_secure setting. The browser will then use two
  // separate session cookies for the HTTPS and HTTP versions of the site. So we
  // must use different session identifiers for HTTPS and HTTP to prevent a
  // cookie collision.
  
if (ini_get('session.cookie_secure')) {
    
$session_name .= 'SSL';
  }
  
// Strip leading periods, www., and port numbers from cookie domain.
  
$cookie_domain ltrim($cookie_domain'.');
  if (
strpos($cookie_domain'www.') === 0) {
    
$cookie_domain substr($cookie_domain4);
  }
  
$cookie_domain explode(':'$cookie_domain);
  
$cookie_domain '.'$cookie_domain[0];
  
// Per RFC 2109, cookie domains must contain at least one dot other than the
  // first. For hosts such as 'localhost' or IP Addresses we don't set a cookie domain.
  
if (count(explode('.'$cookie_domain)) > && !is_numeric(str_replace('.'''$cookie_domain))) {
    
ini_set('session.cookie_domain'$cookie_domain);
  }
  
session_name('SESS'md5($session_name));
?>

Наша цель, как я понимаю, сформировать одинаковый session_name для всех сайтов.
После внимательного изучения вышеприведенного фрагмента кода видим, что для этого надо:

1. Задать в settings.php:
ini_set('session.name', 'NEKOE_SESSION_NAME');
причем это самое NEKOE_SESSION_NAME может быть абсолютно произвольной строкой, но, обязательно, одной и той же для всех сайтов из мультисайтовой связки.
2. НЕ задавать в settings.php $cookie_domain, Друпал сам вытащит его из текущего УРЛа.

При таком раскладе будет для каждого сайта из связки генериться единая сессия, что должно привести к нашей цели, но для каждого сайта будут ставиться свои куки.
В теории вроде все красиво и правильно.
На практике проверю завтра вечером, а щас спааааааааааааааааааааатььььььььь:)

ЗЫ надо еще разобраться тут с $base_url... завтра...

Аватар пользователя AnNik AnNik 30 декабря 2009 в 7:54

Глянул код с утра на свежую голову, и вопросов появилось больше...
Во-первых, при отсутствующем в settings.php $cookie_domain $session_name формируется из $base_url, и тут еще разбираться и разбираться...
Во-вторых, пока непонятно, как в этом коде вообще получаются разные сессии для разных пользователей... в том числе для неавторизованных... копаем дальше...

Аватар пользователя VladSavitsky VladSavitsky 6 января 2010 в 19:43

Есть хорошая поговорка: "Если ты придумал что-то действительно гениальное, то поищи в интернете - кто-то это уже сделал до тебя!".
Подлагаю вас сдаться и воспользоваться одним из множества существующих решений данной проблемы.
Поиск вам в помощь.

Аватар пользователя givchik givchik 3 ноября 2010 в 17:47

VladSavitsky
Вы говорили что ini_set('session.name', 'mysite_PHPSESSID'); можно использовать при построении мультисатинга с использованием домена и его суб-доменов.
А можно по подробней по гроб жизни буду обязан