Jump to content
  • 0

Кроссдоменная авторизация между доменами второго и третьего уровней


Torawhite
 Share

Question

Здравствуйте!

Авторизация происходит средствами ajax, php-скрипт расположен на домене первого уровня. База данных одна, домен третьего уровня является поддоменом того же домена второго уровня. Нужно, чтобы авторизация работала на обоих доменах. Авторизация осуществляется с помощью глобального массива $_SESSION. Как же реализовать кроссдоменную авторизацию?

Link to comment
Share on other sites

17 answers to this question

Recommended Posts

  • 0

в базе храните хэш, который сохраняете в куках на домен первого уровня (так они будут работать и на поддоменах)

по хэшу устанавливаете требуемую сессию

Link to comment
Share on other sites

  • 0

в базе храните хэш, который сохраняете в куках на домен первого уровня (так они будут работать и на поддоменах)

по хэшу устанавливаете требуемую сессию

Вы не могли бы чуть подробнее? Мне нужно что-то зашифровать и поместить в базу? Читал, что можно через куки делать, но не совсем понял механизм. То есть мне нужно в php-скрипте, который реализует авторизацию, и который находится в корневом домене, создать некую куку и что-то туда поместить?

Link to comment
Share on other sites

  • 0

в базе храните хэш, который сохраняете в куках на домен первого уровня (так они будут работать и на поддоменах)

по хэшу устанавливаете требуемую сессию

Делаю так:

// в контроллере указываю начало сессии:session_start();// в модели выполняю скрипт по регистрации, после занесения в базу данных данных о пользователе создаю сессию и помещаю туда имя пользователя,которое пришло ко мне при регистрации:$_SESSION['auth']['user']['user_name'] = $name;// получаю идентификатор сессии и записываю его в переменную$SID = session_id();// устанавливаю кукуsetcookie('user', $SID, time()+3600, '', '.torawhite.ru');

Не работает. Что я делаю не так?

Link to comment
Share on other sites

  • 0

в базе храните хэш, который сохраняете в куках на домен первого уровня (так они будут работать и на поддоменах)

по хэшу устанавливаете требуемую сессию

Сейчас увидел, что создаются автоматически без моего участия две куки с одинаковым именем "PHPSESSID", но разными значениями - одна для корневого домена, другая для поддомена, так как session_start(); у меня прописан в контроллере корневого домена и в контроллере поддомена.

Link to comment
Share on other sites

  • 0

Две одинаковые куки не могут быть, последняя бы перезаписала первую.

setcookie('user', $SID, time()+3600, '', 'torawhite.ru');

вы так же должны $SID сохранить у себя в базе.

Когда вы будете заходить на любой из поддоменов, вы проверяете наличие куки user и пытаетесь найти ее в базе, если вы ее нашли, записывает данные в сессию и вы авторизованы.

Только попробуйте $SID сделать более уникальным.

Link to comment
Share on other sites

  • 0

Две одинаковые куки не могут быть, последняя бы перезаписала первую.

setcookie('user', $SID, time()+3600, '', 'torawhite.ru');

вы так же должны $SID сохранить у себя в базе.

Когда вы будете заходить на любой из поддоменов, вы проверяете наличие куки user и пытаетесь найти ее в базе, если вы ее нашли, записывает данные в сессию и вы авторизованы.

Только попробуйте $SID сделать более уникальным.

Сейчас напишу, как у меня всё сейчас происходит. Маленько разобрался в вопросе, но не до конца

Две одинаковые куки не могут быть, последняя бы перезаписала первую.

setcookie('user', $SID, time()+3600, '', 'torawhite.ru');

вы так же должны $SID сохранить у себя в базе.

Когда вы будете заходить на любой из поддоменов, вы проверяете наличие куки user и пытаетесь найти ее в базе, если вы ее нашли, записывает данные в сессию и вы авторизованы.

Только попробуйте $SID сделать более уникальным.

Регистрацию/Авторизацию осуществляю с помощью суперглобального массива $_SESSION данные отправляю асинхронно ajax на домен второго уровня

example.ru

, там выполняется php-скрипт регистрации и авторизации. По такому же принципу реализована корзина. Сайт имеет поддомен 

sub.example.ru

. в .htaccess прописано

php_value session.cookie_domain ".example.ru"

сессию начинаю в обоих контроллерах(контроллер 1 - .example.ru, контроллер 2 - sub.example.ru) таким образом:

if (!session_id()) { ini_set('session.use_cookies', 'On'); ini_set('session.use_trans_sid', 'Off'); ini_set('session.cookie_domain', '.example.ru'); session_set_cookie_params(0, '/', '.example.ru'); session_start(); } 

Кука PHPSESSID с идентификатором передаётся между доменом о поддоменом и обратно. Проблема 1: если осуществлять регистрацию и авторизацию находясь на sub.example.ru (напомню - ajax отправляет данные на .example.ru) то $_SESSION['auth'] создаётся, но после обновления страницы пропадает. Проблема 2: если осуществлять регистрацию и авторизацию находясь на sub.example.ru (напомню - ajax отправляет данные на .example.ru) и при этом существует $_SESSION['cart'], то $_SESSION['auth'] создаётся вне сессии, в которой создана $_SESSION['cart'], после обновления страницы $_SESSION['auth'] также пропадает. НО! Если осуществлять регистрацию/авторизацию с .example.ru и при этом существует $_SESSION['cart'], то $_SESSION['auth']создаётся в этой же сессии, после обновления никуда не пропадает и сохраняется на sub.example.ru. В чём проблема?

Link to comment
Share on other sites

  • 0

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

Link to comment
Share on other sites

  • 0

вы передаете свой идентификатор в куках и он будет одинаковым на всех сайтах домена, сессия на каждом поддомене своя

если вы храните в сессии какие-то данные, вам нужно их записывать в сессию при авторизации по куке

А почему сессия пропадает при входе с поддомена? И как записать в сесию по куке, если запрос отправляется асинхронно, получается, что кука уже будет не видна?

Link to comment
Share on other sites

  • 0

попробуйте php_value session.cookie_domain ".site.com" в .htaccess, возможно вам хватит

Это у меня прописано, не работает

попробуйте php_value session.cookie_domain ".site.com" в .htaccess, возможно вам хватит

Если сессии разные у домена и поддомена, то, возможно у меня подход не тот. Может нужно как-то передавать идентификатор сессии в ajax при регистрации/авторизации?

Link to comment
Share on other sites

  • 0

попробуйте php_value session.cookie_domain ".site.com" в .htaccess, возможно вам хватит

Передача идентификатора ничего не изменила. Передавал так:

$.ajax({ url: 'http://site.ru/?PHPSESSID=' + $.cookie('PHPSESSID'),// дальше остальной код
Link to comment
Share on other sites

  • 0

Что у вас хранится в сессии для авторизации по ней и откуда вы это берете?

Смотрите, сессия создана, PHPSESID кука присутствует и домен её равен .site.ru, при переходе с site.ru на sub.site.ru и обратно она сохраняется, значение остаётся тем же. Я нахожусь на sub.site.ru и заполняю поля ввода для регистрации, жму кнопку, далее ajax отправляет все данные php-скрипту на site.ru (я так понимаю, что никакая кука этому скрипту видна не будет). Скрипт делает запрос в базу и сверяет, логин, если он уникален, то добавляет запись в базу, извлекает из базы id нового пользователя и создаёт сессию:

$sql3 = "SELECT user_id FROM users WHERE user_mail = :user_mail";        $data3 = $pdo->prepare($sql3);        $data3->bindValue(':user_mail', $mail, PDO::PARAM_STR);        $data3->execute();        $res3 = $data3->fetch(PDO::FETCH_ASSOC);        $_SESSION['auth']['user']['user_name'] = $name;        $_SESSION['auth']['user']['user_id'] = $res3['user_id'];

Далее, он выводит html оператором echo - пункты меню личного кабинета, имя пользователя - этот код html является ответом сервера для ajax. Отправляет его обратно на sub.site.ru и вставляет в нужно место на странице. После обновления всё пропадает, так как, видимо, сессия тут иная и ничего в ней нет... Я думал, что мы передаём идентификатор, чтобы сервер понял, в какую сессию записать данные, но что-то я не до конца тут понял...

Link to comment
Share on other sites

  • 0

а теперь смотрите как у вас все это может быть (рассмотрим вариант, когда у вас разные сессии на каждом поддомене):

вы находитесь на sub.site.ru на котором нет куки user

отправляете авторизационные данные на site.ru, там у вас в сессию добавляются имя + ид пользователя и вы создаете куку, записав ее в базу с ассоциацией данного пользователя

скажем данный скрипт возвращает вам правильность авторизации

 

ваши последующие действия (можно сделать по разному):

вы делаете аякс запрос на sub.site.ru, теперь у вас есть кука, но в сессии нет пока данных о пользователе, значит мы делаем авторизацию по куке, а не логину и паролю

$sql3 = "SELECT user_id FROM users WHERE user_cookie = :user_cookie";

и полученные данные записываем в сессию для sub.site.ru

 

все последующие запросы к sub.site.ru будут авторизироваться по сессии под нужным пользователем, перезагрузка текущей страницы должна показать требуемые данные для авторизованного пользователя

 

замечу, что данная реализация может быть переделана на авторизацию с разных поддоменнов

Link to comment
Share on other sites

  • 0

а теперь смотрите как у вас все это может быть (рассмотрим вариант, когда у вас разные сессии на каждом поддомене):

вы находитесь на sub.site.ru на котором нет куки user

отправляете авторизационные данные на site.ru, там у вас в сессию добавляются имя + ид пользователя и вы создаете куку, записав ее в базу с ассоциацией данного пользователя

скажем данный скрипт возвращает вам правильность авторизации

 

ваши последующие действия (можно сделать по разному):

вы делаете аякс запрос на sub.site.ru, теперь у вас есть кука, но в сессии нет пока данных о пользователе, значит мы делаем авторизацию по куке, а не логину и паролю

$sql3 = "SELECT user_id FROM users WHERE user_cookie = :user_cookie";

и полученные данные записываем в сессию для sub.site.ru

 

все последующие запросы к sub.site.ru будут авторизироваться по сессии под нужным пользователем, перезагрузка текущей страницы должна показать требуемые данные для авторизованного пользователя

 

замечу, что данная реализация может быть переделана на авторизацию с разных поддоменнов

Получается, что без танцев с бубном не получается... Есть ещё один метод, который пришёл мне в голову, правда он попахивает быдлокодом: Весь обработчик поместить в отдельный php-файл, скажем, reg_auth.php, инклудить его на site.ru и на sub.site.ru. А в жаваскрипт, который аяксом отправляет запрос, в url: прописывать текущий домен - $_SERVER['HTTP_HOST'], то есть или site.ru, или sub.site.ru. По идее, всё должно работать. Как вам такой вариант?

Edited by Torawhite
Link to comment
Share on other sites

  • 0

Дык у вас на каждом поддомене должен быть скрипт авторизации по куке и сессие, авторизацию по логину и регистрацию только через основной домен

Вот, сейчас сделал, как придумал. Работает, вроде! Спасибо вам большое за помощь!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy