Схема такова:
Есть поддомен 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