ФорумПрограммированиеПыхнуть хотите?F.A.Q. → XML-RPC / SOAP. Общая авторизация для поддоменов одного проекта.

XML-RPC / SOAP. Общая авторизация для поддоменов одного проекта.

  • md5

    Сообщения: 11949 Репутация: N Группа: в ухо

    Spritz 14 декабря 2007 г. 1:56

    Для создения системы общей авторизации для всех проектов Вашего портала (на разных поддоменах) можно использовать так называемый пасспорт.

    Схема такова:

    Есть поддомен passport.domain.ru, где установлен сервер авторизации.

    Заходя на любой из наших проектов и авторизуясь, запрос с логином и паролем уходит в "паспорт", возвращяется результат авторизации и пользователю ставится кука на всю доменную зону (.domain.ru) + сессионная переменная обозначающая, что наш пользователь уже авторизовался и имеет доступ к нашему проекту.

    В куку ставится так называемый "token", по которому можно авторизовать клиента, пришедшего на проект через некоторое время, когда сеанс был завершен.

    Таким образом у авторизационного сервера есть 2 процедуры:


    • Авторизация по логину и паролю (auth_by_login)

    • Авторизация по "token" (auth_by_token)



    Эти процедуры вызываются при помощи технологий XML-RPC или SOAP (Simple Object Access Protocol).
    Remote Procedure Call — протокол удаленного вызова процедур.

    Идея заключается в формировании XML посылки, которая содержит в себе название вызываемой процедуры, необходимые параметры и направляется серверу.
    От сервера приходит ответ в таком же формате.

    Для работы с SOAP в php есть расширение, php_soap.

    Использовать его крайне просто, мозг вобще не напрягается.

    Пример использования:

    // Задаем URL сервера авторизации
    $client = new SoapClient("http://passport.domain.ru/wsdl");

    /*
    ** Добавляем параметры, необходимые для авторизации
    ** Здесь пример использования авторизации по логину и паролю
    ** Передаём в аргументах login, password, IP пользователя (опционально) и название текущего проекта (опционально)
    ** Название проекта, допустим, photos.domain.ru (фотогалереи пользователей)
    */

    $args = array ("login"=>$login, "password"=>$password, "ip"=>$_SERVER['REMOTE_ADDR'], "project"=>"photos");

    /*
    ** Вызываем метод "auth_by_login", передавая ему массив параметров
    ** и в переменную $response мы получаем ответ сервера
    */

    $response = $client->__soapCall("auth_by_login", $args);


    На выходе переменная $response является объектом.
    Для тех, кто работе с объектами предпочетает работу с массивами можно сделать функцию перевода в массив, вроде этой:

    function obj2array($obj) {
    $array = array();
    foreach ($obj as $key => $val) {
    switch(true) {
    case is_object($val):
    case is_array($val):
    $array[$key] = obj2array($val);
    break;
    default:
    $array[$key] = $val;
    break;
    }
    }
    return $array;
    }


    Переведём в массив и выведем:

    $response = obj2array($response);
    print '<pre>';
    print_r($response);
    print '</pre>';



    Как видим, все красиво и просто.


    Как выглядит исходное сообщение?


    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
    <auth_by_login xmlns="http://passport.domain.ru/wsdl/">
    <login>login</login>
    <password>password</password>
    <ip>127.0.0.1</ip>
    <project>photos</project>
    </auth_by_login>
    </soap:Body>
    </soap:Envelope>


    Пример ответа:


    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
    <auth_by_loginResponse xmlns="http://passport.domain.ru/wsdl/">
    <auth_by_loginResult>
    <id>123</id>
    <username>Имя пользователя</username>
    <role>0</role>
    </auth_by_loginResult>
    </auth_by_loginResponse>
    </soap:Body>
    </soap:Envelope>



    Спецификация SOAP
    Подробное описание технологии


    Необходимо также помнить о кешировании результатов.
    В php.ini есть секция [soap]


    [soap]

    soap.wsdl_cache_enabled = "1"
    ; включает или выключает WSDL кеширование

    soap.wsdl_cache_dir = "/tmp"
    ; указание директории, где будут храниться временные файлы

    soap.wsdl_cache_ttl = "86400"
    ; время в секундах, в течении которого будет храниться кешированный файл



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

    Подробнее о XML-RPC и о примере использования классов для работы с ним — http://phpclub.ru/detail/article/xmlrpc
    Спецификация XML-RPC
    все умрут, а я изумруд
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 15 декабря 2007 г. 1:10, спустя 23 часа 13 минут 31 секунду

    Где серверная часть? Она самая интересная.

    Я бы не стал гонять объекты между процессами, тем более что это в данном случае не дает никаких преимуществ перед массивами.
    С теоретической точки зрения — массивы больше подходят под определения "данные", которые следует передавать. В то время, как объект, это структурная единица определенной программы.
    С практической — нужно быть точно уверенным, что определение класса данного объекта будет одно и доступно как на сервере и на клиенте в нужное время. Даже в рамках одного сценария при передаче через сессии постоянно с этим бывают глюки. Что уж говорить при передаче между двумя серверами, где и пых может быть разный и требуется держать две копии описания.
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 13 марта 2009 г. 4:31, спустя 454 дня 2 часа 21 минуту

    Из примера непонятно преимущество расширения php_soap по сравнению с посылкой POST того же содержания через, например, php_curl. Не всё ли равно как выглядят данные на транспортном уровне?

    Наверное я чего-то не понял.
    ιιlllιlllι унц-унц
  • ubica

    Сообщения: 530 Репутация: N Группа: Кто попало

    Spritz 13 марта 2009 г. 6:11, спустя 1 час 40 минут 21 секунду


    Из примера непонятно преимущество расширения php_soap по сравнению с посылкой POST того же содержания через, например, php_curl. Не всё ли равно как выглядят данные на транспортном уровне?

    Наверное я чего-то не понял.

    а именно, 2 вещей:
    *ты на базовом курле не напишешь это в 3 строчки
    *данные выглядят по разному уже на уровне приложений (см. http://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D1%82%D0%B5%D0%B2%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_OSI)
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 13 марта 2009 г. 6:21, спустя 10 минут 13 секунд

    ubica, выйди из тени в аську! сцуко, хватит прятатсо)))))
    Сапожник без сапог
  • ubica

    Сообщения: 530 Репутация: N Группа: Кто попало

    Spritz 13 марта 2009 г. 6:28, спустя 6 минут 53 секунды

    только встал.. щас, пожрав, приду на работу и выйду)
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 13 марта 2009 г. 6:49, спустя 20 минут 45 секунд

    ubica, ТЫ ПОЛНЫЙ ПИЗДЕЦ! ))))))))))))))))))))) 7 часов вечера, а ты проснулся :-D
    Сапожник без сапог
  • Z-MODe

    Сообщения: 199 Репутация: N Группа: Кто попало

    Spritz 2 марта 2010 г. 3:57, спустя 353 дня 22 часа 7 минут

    Вопрос. А на сервере нужен WSDL, чтобы принимать такие запросы? Просто есть документация общения с одним сервисом, но ссылок на wsdl нету( и выходит ошибка, есть только название функции и адресс.
    Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't find <definitions> in
  • Z-MODe

    Сообщения: 199 Репутация: N Группа: Кто попало

    Spritz 2 марта 2010 г. 6:29, спустя 2 часа 32 минуты 18 секунд

    Вроде разобрался..
    WSDL эту использую http://schemas.xmlsoap.org/soap/envelope/

    А можно как нибудь узнать, что у тебя сформировалось?
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 2 марта 2010 г. 7:03, спустя 34 минуты 31 секунду

    я не знаю почему, но меня от SOAP тянет в тоску. Хоть не разу с ним и не работал.
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 2 марта 2010 г. 7:09, спустя 5 минут 30 секунд


    я не знаю почему, но меня от SOAP тянет в тоску. Хоть не разу с ним и не работал.
    а что не тянет?
    Сапожник без сапог
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 2 марта 2010 г. 7:12, спустя 3 минуты 9 секунд

    сиськи, бухло
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 2 марта 2010 г. 7:38, спустя 25 минут 38 секунд

    письки, трава
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 2 марта 2010 г. 7:41, спустя 3 минуты 48 секунд


    я не знаю почему, но меня от SOAP тянет в тоску. Хоть не разу с ним и не работал.
    потому что XML
    adw/0
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 2 марта 2010 г. 9:49, спустя 2 часа 7 минут 43 секунды

    Эдво сработал как психолог. Я и сам раньше не понимал почему SOAP вгонял меня в тоску. Теперь я понял, в чем корень моей проблемы))

Пожалуйста, авторизуйтесь, чтобы написать комментарий!