За последние 24 часа нас посетили 17603 программиста и 1590 роботов. Сейчас ищут 1450 программистов ...

Кроссдоменная авторизация

Тема в разделе "Решения, алгоритмы", создана пользователем antonn, 9 фев 2008.

  1. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    RomanBush
    а у слона толще. И чтобы сделать кроссдоменную авторизацию можно написать свою ось (да готовых открытых осей навалом, мне что, пеерчислять их все и говорить как их написть???), поднять свои вебсервера (да полно книжек о том, как сделать вебсервер, и как их администрировать, а у кого-то экзамен там был, куча вопросов и ни одного неправильного ответа, и вопросы далеко не "как с помощью зубочистки, стакана воды и картины Репина настроить удаленно роутер через консольный интерфейс") и сделать свою сеть (да полно в нете книжек как сделать свою сеть, даже перечислять не буду).
    Есть что сказать - мы с удовольствием выслушаем.
     
  2. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Я что-то не по делу сказал? Или тебе обидно, что у тебя тоньше?
     
  3. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    конечно не поделу. разработать с нуля систему разобрав при этом AD - это далеко не по делу.
    повторюсь: есть что сказать - мы с удовольствием выслушаем.
     
  4. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    ok. Мне нечего сказать. Изобретайте велосипед дальше.
     
  5. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Решил ответить "поразвёрнутее".

    Если ты хочешь быть програмистом и у тебя есть задача под названием "Кроссдоменная авторизация", то ты поднимешь жопу, пойдёшь в магазин, купишь там книжки, которые я посоветовал и внимательно их изучишь, а не просто пролистаешь.
    А если ты начитался "21 урок по дельфи", "21 урок по php", "21 урок по яваскрипту" и мнишь себя реальным крутым програмером - флаг тебе в ж..., барабан на шею и ветер в спину - мни себя крутым програмером дальше. Лично мне разговаривать с тобой не о чем.
    Это моя позиция.
     
  6. nimistar

    nimistar Активный пользователь

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    RomanBush - ты может видел мои проекты ??? или в курсе моих знаний ? твои высказывания несут явно оскорбительный характер, причем я немогу припомнить чтобы давал повода!

    вариант ответа на тему:
    , я нахожу мало информативным, как и последущее "типа как-то так". Мой вопрос состоял в том чтобы обсудить варианты, и естественно при необходимости я обращусь к различным источникам. Я уверен что вариантов реализации подобной задачи было придумано немало, и если у кого был опыт, я предлагал им поделится, потому как опыт ВСЕГДА важнее сухой теории!


    -------------------
    в надежде на адекватный ответ!
     
  7. GreatWasp

    GreatWasp Активный пользователь

    С нами с:
    11 янв 2008
    Сообщения:
    94
    Симпатии:
    0
    Адрес:
    Узбекистан, Ташкент.
    В свое время у меня тоже встала такая проблема.
    Пробовали через JavaScript сделать но результат был таким как сказал уважаемый Dagdamor.
    Потом присмотрелись к openId.... и сделали по этой аналогии. То есть база пользователей одна. Есть машина на которой весит сервер XML_RPC. Юзверь заходит на сайт вбивает свои данные, потом идет обращение на сервак с пользовательской БД и происходит авторизация. ИМХО нормальный вариант.
     
  8. dAllonE

    dAllonE Guest

    Эм...

    nimistar, Джордж Шлосснейгл "Профессиональное программирование на PHP" Глава 13. Подзаголовок "Единая регистрация"

    Там в принципе то же что сказал Sergey89 только с примерами и кусочками кода. и ссылками на другую литературу по этой теме в конце главы...
     
  9. nimistar

    nimistar Активный пользователь

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    dAllonE - сеньк!! супер книга :) пойду посоветую её остальным! :)!
     
  10. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    а как это реализовано в Яндексе?
    mail.yandex.ru
    narod.ru
    мой круг
    и тд. Это ж не поддомены.
     
  11. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Я же писал примерную реализацию. В одном из первый сообщение в теме.
     
  12. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    мне б кусок кода, конкретный пример) А то та книга "професиональное программирование" в виде скана. Перенабирать вручную/распознавать не хоцца.
     
  13. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Koc
    Организуй собственные сессии на основе куки :)
    Алгоритм:
    1)При авторизации заводим сесиию.
    2)Записываем номер сессии и например IP клиента в БД.
    3)Ставим куки с ID сесии.
    4)Каждый раз проверяем наличие ID из куки в БД и совпадение IP.

    Ну вот и все, осталось только организовать для всех доменов доступ к одной БД :)
     
  14. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    а так же поставить одну куку на все домены? :)
     
  15. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    в теории можно при авторизации сразу ставить куки на все домены. Но это не дело.
     
  16. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    На практике нужно авторизовываться на выделенном домене. А с других доменов дёргать оттуда куку.
     
  17. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Koc
    Почему это не дело? Не общими фразами пожалуйста, а конкретно и с примером?
     
  18. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    есть у нас блоги на wordpress MU (*.blogs.com). Есть форум VB(forum.ua). Есть самописный сайт (site.net). Мы хотим при авторизации на сайте слать куку сайта ,форума, блогов. Не жирно ли? Ну да ладно, мы можем это сделать, благо сайт самописный. В случае со сторонним движком нужно будет искать где эта печенька отправляется и тулить отправку своих. Возможно делать хак для VB и плагин для WP. Хочется чтоб все работало без всех этих манипуляций.

    У меня получалось без изменения кода VB делать совместную авторизацию на сайте (site.com) и форуме (forum.site.com). Нужно было только в Вобле ставить галочку "запомнить меня".

    Хотя с другой стороны, механизмы авторизации у WP и VB заведомо разные. И что-то одно из этого ковырять по-любому придется.
     
  19. klerick

    klerick Guest

    Идея кода и решения очень хороша в своей простоте. Вот только не работает почему-то.
    У меня класс авторизации, который вызывается на всех поддоменах с доменом domen.com (например). на поддомене auth.domen.com вызываю функцию, которая указанным выше способом определяет куки,
    на поддомене client.domen.com пишу echo $_COOKIE["моя_кука :)"], но все пусто.
     
  20. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Нельзя установить на поддомене кукис видимый для других поддоменов. Это то же самое, что ставить куку с одного домена на другом.

    Таки способом кукис надо ставить на главной домене, а не поддоменах.
     
  21. klerick

    klerick Guest

    Попробовал. Авторизацию поставил на главный домен.
    Все равно не видит куки... Странно, конечно.
     
  22. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    klerick
    Код в студию
     
  23. klerick

    klerick Guest

    Класс авторизации: кстати, если кому пригодится, то пользуйтесь на здоровье. :)
    Код (Text):
    1.  
    2. class Authorization
    3. {
    4.     var $id = "";
    5.     var $mysql = ""; //идентификатор класса Mysql
    6.     var $error = "";
    7.     var $usercode = "";
    8.  
    9.     function IsUserExist($login, $pwd="")
    10.     {
    11.         $query = "";
    12.         $login = strtolower($login);
    13.         if($login && $pwd)
    14.         {
    15.             $query = "select `id`, `usercode` from `user` where (`login`='".$login."') and (`pwd`='".$pwd."')";
    16.         }
    17.         else
    18.         {
    19.             $query = "select `id`, `usercode` from `user` where `login`='".$login."'";
    20.         }
    21.         $data = $this->mysql->Query($query);
    22.         if(mysql_num_rows($data) > 0)
    23.         {
    24.             $this->id = mysql_result($data, 0, "id");
    25.             $this->usercode = mysql_result($data, 0, "usercode");
    26.             return $this->id;
    27.         }
    28.         else
    29.         {
    30.             return false;
    31.         }
    32.     }
    33.  
    34.     function GetDateKoef()
    35.     {
    36.         list($y, $m, $d) = explode(":", date("Y:m:d"));
    37.         return round(abs(($y*$m)/$d));
    38.     }
    39.  
    40.     function GetIpMas()
    41.     {
    42.         $ip = $_SERVER['REMOTE_ADDR'];
    43.         $ips = explode(".", $ip);
    44.         $ip = implode("", $ips);
    45.         return $ip;
    46.     }
    47.  
    48.     function GetUserCheck($us_id)
    49.     {
    50.         return md5($this->GetDateKoef().$us_id.$this->GetIpMas.$this->usercode);
    51.     }
    52.  
    53.     function SetLoggedUser()
    54.     {
    55.         setcookie(AUTH_ID, $this->id."", 0, '/', '.'.SITE_HOST);
    56.         setcookie(AUTH_CHECK, $this->GetUserCheck($this->id)."", 0, '/', '.'.SITE_HOST);
    57.     }
    58.  
    59.     function OutLoggedUser()
    60.     {
    61.         setcookie(AUTH_ID, "");
    62.         setcookie(AUTH_CHECK, "");
    63.     }
    64.  
    65.     function IsLoggedIn()
    66.     {
    67.         $res = false;
    68.         $cook = $_COOKIE[AUTH_ID];
    69.         $cook_ks = $_COOKIE[AUTH_CHECK];
    70.         if($cook)
    71.         {
    72.             if ($this->GetUserCheck($cook) == $cook_ks)
    73.             {
    74.                 $res = $cook;
    75.             }
    76.         }
    77.         return $res;
    78.     }
    79.  
    80.     function Authorization($mysql, $login="", $pwd="")
    81.     {
    82.         $this->mysql = $mysql;
    83.         $this->error = "";
    84.         if($login)
    85.         {
    86.             if($this->IsUserExist($login, $pwd))
    87.             {
    88.                 $this->SetLoggedUser();
    89.             }
    90.             else
    91.             {
    92.                 $this->error = "User is not registered!";
    93.             }
    94.         }
    95.         else
    96.         {
    97.             $this->error = "No login!";
    98.         }
    99.     }
    100. }
     
  24. klerick

    klerick Guest

    Константы AUTH_ID и AUTH_CHECK задаются в каком-нибудь файле настроек и определяют названия куков. (это для последующих эксплуататоров)

    Авторизация, понятное дело, проходит следующим образом:
    Код (Text):
    1.     $mysql = new Mysql();
    2.     $mysql->Connect();
    3.     $auth = new Authorization($mysql, $login, $pwd);
    4.     $mysql->Disconnect();
    Проверка пользователя:
    Код (Text):
    1.  
    2. $mysql = new Mysql();
    3. $mysql->Connect();
    4.  
    5. $auth = new Authorization($mysql);
    6. if(!$auth->IsLoggedIn())
    7. {
    8.     $mysql->Disconnect();
    9.     header("Location: ".SITE_URL."error.php");
    10.     exit();
    11. }
    Вот и получается, что SITE_URL и SITE_HOST - это соответственно url и хост главного домена domen.com, вызов проверки пользователя производится на client.domen.com
    Не могу понять, почему не видна кука. Делаю все на локале, естественно.
     
  25. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    о я чёт пропутил тему...
    Так, а что если, создать создать промежуточную табличку, с единственной записью неактивной сессии
    т.е. алгоритм такой, на сайте с авторизацией в эту табличку(если она пуста) заноситься запись с нашей сессией, юзер перенаправляется на дочерний сайт, который берёт эту неактивную сессию, ставит куку и пр.(уже у себя), табличку очищает

    В табличке может быть только одна запись, так что воможны задержки, но это всё можно настроить и свести к минимуму, сделать всякие тайм ауты и проверки