Для создения системы общей авторизации для всех проектов Вашего портала (на разных поддоменах) можно использовать так называемый пасспорт.
Схема такова:
Есть поддомен 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;
}
Переведём в массив и выведем:
Как видим, все красиво и просто.
Как выглядит исходное сообщение?
<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