аутентификация в веб-сервисах

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
alexk984
Сообщения: 433
Зарегистрирован: 2010.10.21, 15:03
Контактная информация:

аутентификация в веб-сервисах

Сообщение alexk984 »

Как она происходит если через один клиент с веб-сервисом взаимодействуют пользователи различных уровней доступа?
На форуме нашел такой код

Код: Выделить всё

/**
 * контроллер soap
 */
class SoapController extends CController
{
    protected $authenticated = false;
    
    public function actions()
    {
        return array(
            'server'=>array(
                'class'=>'CWebServiceAction',
            ),
        );
    }
    
    /**
     * Авторизация клиента soap
     * @param string $username
     * @param string $password
     * @return boolean result of auth
     * @soap
     */
    public function auth($username, $password)
    {
        // классическая авторизация на yii
        $identity = new SoapIdentity($username, $password);
        if( $identity->authenticate() )
        {
            // авторизация сохраняется на один запрос и не для пользователя
            $this->authenticated = true;
        }
        return true;
    }
}

/**
 * Некий обьект, хранящий авторизационные данные
 */
class SoapAuth
{
    /** @var int password */
    public $password;
    /** @var int username */
    public $username;

    public function __construct($l, $p)
    {
        $this->password = $p;
        $this->username = $l;
    }
}

// подключаемя
$client = new SoapClient("http://localhost/commerce-soap/soap.php/soap/server");
// устанавливаем заголовок для авторизации
// магия состоит в том, что метод SoapController::auth() будет вызван именно перед действием вебсервиса.
$wsu = 'http://schemas.xmlsoap.org/ws/2002/07/utility';
$soapHeaders[] = new SoapHeader($wsu, 'auth', new SoapAuth("kuzp","pass"));
$client->__setSoapHeaders( $soapHeaders ); 
Я так понимаю фреймворк не предоставляет встроенных механизмов для этого?
Аватара пользователя
because
Сообщения: 689
Зарегистрирован: 2010.09.30, 22:01

Re: аутентификация в веб-сервисах

Сообщение because »

и так вроде неплохо :)
RTFM !
Аватара пользователя
alexk984
Сообщения: 433
Зарегистрирован: 2010.10.21, 15:03
Контактная информация:

Re: аутентификация в веб-сервисах

Сообщение alexk984 »

Так же есть требование заказчика - передача данных методом JSON - это реально сделать?
Аватара пользователя
MaxOtto
Сообщения: 139
Зарегистрирован: 2010.01.30, 17:44

Re: аутентификация в веб-сервисах

Сообщение MaxOtto »

У меня полностью заработала авторизация в соответствии с прилагаемым примером (на клиенте PHP). На том этапе, где в примере написано

Код: Выделить всё

if( $identity->authenticate() )
        {
            // авторизация сохраняется на один запрос и не для пользователя
            $this->authenticated = true;
        } 
нужно просто разобрать права более подробно и расписать далее в зависимости от прав.

JSon - ничего страшного. Это просто способ представления сложных объектов в виде строки. Эту строку и передаем через SOAP. На другой стороне из JSON восстанавливаем объект для дальнейшего использования. http://ru.wikipedia.org/wiki/JSON
Аватара пользователя
alexk984
Сообщения: 433
Зарегистрирован: 2010.10.21, 15:03
Контактная информация:

Re: аутентификация в веб-сервисах

Сообщение alexk984 »

MaxOtto писал(а):У меня полностью заработала авторизация в соответствии с прилагаемым примером (на клиенте PHP). На том этапе, где в примере написано

Код: Выделить всё

if( $identity->authenticate() )
        {
            // авторизация сохраняется на один запрос и не для пользователя
            $this->authenticated = true;
        } 
нужно просто разобрать права более подробно и расписать далее в зависимости от прав.

JSon - ничего страшного. Это просто способ представления сложных объектов в виде строки. Эту строку и передаем через SOAP. На другой стороне из JSON восстанавливаем объект для дальнейшего использования. http://ru.wikipedia.org/wiki/JSON
Спасибо :) По JSON сейчас договорился с заказчиком об отмене этого требования.
Аватара пользователя
alexk984
Сообщения: 433
Зарегистрирован: 2010.10.21, 15:03
Контактная информация:

Re: аутентификация в веб-сервисах

Сообщение alexk984 »

Я все-таки не совсем понял кое-что, по задумке клиент используют зарегистрированные пользователи, которые выполняют через клиент различные действия. Должны ли эти пользователи авторизовываться через сервис, то есть он вводит логин пароль и сайт-клиент отправляет сервису именно эти логин и пароль (получается все время разные)? По-моему это что-то не то...
Аватара пользователя
MaxOtto
Сообщения: 139
Зарегистрирован: 2010.01.30, 17:44

Re: аутентификация в веб-сервисах

Сообщение MaxOtto »

НУ, по-моему, SOAP - это удаленный вызов некой функции, за реализацию которой отвечет сервер, а результат используется на клиенте. Причем, в качестве клиента может выступать WEB-сайт в целом или какая-то приблуда на EXCEL, как у меня в проекте.

Независимо от других авторизаций, если серверу для выполнения запроса SOAP нужны свои авторизационные сведения, то их надо предоставить (это придумывает разработчик сервиса исходя из своих требований).

Сам же SOAP-сервер работает многопоточно, для каждого вызова разных клиентов могут использоваться разные сведения для авторизации. Например, на сайте-клиенте работает несколько пользователей. Они открывают страницы, в процессе подготовки которых движок сайта-клиента обращается к SOAP-сервису и выдает пользователю результаты запроса. В зависимости от логики сервера SOAP, это могут персональные логин-пароль пользователя, либо какие-то единые логин-пароль (например - авторизация сайта-клиента, а не каждого пользователя сайта-клиента).

Тут прямая аналогия с сервером SQL - разные пользователи из своих клиентов запускают запрос, на что сервер отвечает в соответствии с правами клиента.

Не знаю, доступно-ли рассказал. По моему, если сервер SOAP внешний (другого разработчика), то надо руководствоваться интерфейсами и правилами доступа, установленными этим разработчиком. Если же всё пишем сами, то тут можно под себя заточить всё, что надо, лишь бы было четкое понимание, что мы хотим в итоге получить.

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

Когда-же я отлаживаю сервис на PHP-клиенте, по там прямо в текст скрипта я вставляю какие-либо авторазационные данные (как это я делал-бы для доступа к базе SQL на чистом PHP). НО, права на запуск этого куска кода PHP я даю авторизованным пользователям с правом ADMIN, то есть - себе, с использованием стандартных возможностей YII
Аватара пользователя
alexk984
Сообщения: 433
Зарегистрирован: 2010.10.21, 15:03
Контактная информация:

Re: аутентификация в веб-сервисах

Сообщение alexk984 »

MaxOtto, спасибо огромное за ответ, но я все же не до конца понимаю, получается что логин и пароль нужно посылать при каждом обращении? У вас написано что авторизация сохраняется на один запрос. Как в вашем EXCEL-клиенте поддерживается сессия?
Аватара пользователя
MaxOtto
Сообщения: 139
Зарегистрирован: 2010.01.30, 17:44

Re: аутентификация в веб-сервисах

Сообщение MaxOtto »

Пример авторизации в SOAP, который описан здесь в теме - не мой. Я его повторил, но глубоко не лез. Сама идея - имя и пароль при каждом обращении - мне понравились, если честно. Мне одно время всю плешь проели насчет безопасности, поэтому вот так.

Сессии в SOAP? Возможно и есть такое, я не глубокий знаток SOAP, я просто добился от него того минимума, что мне нужно.

Сча бегло окунулся в тему - решение есть, надо копать дальше. Для затравки: http://ru2.php.net/manual/en/soapclient.soapclient.php, искать слово "session".

Во всех моих примерах я при каждом запросе использую информацию для авторизации. У меня несколько специфичная задача, где сессии не нужны принципиально, даже вредны.

Мой основной SOAP-клиент написан на EXcel. Пока открыта формочка запуска процесса, имя пользователя и пароль живут в переменных. После удачной авторизации я храню локально (в самом файле Excel) только имя пользователя, но заставляю его всегода вводить пароль перед обращением к сервису. Для меня это важно с точки зрения безопасности - если файл пойдет по "неправильным" рукам, актуальной информации уже нельзя будет получить.
mitallast
Сообщения: 207
Зарегистрирован: 2010.02.21, 20:40
Откуда: Голицыно
Контактная информация:

Re: аутентификация в веб-сервисах

Сообщение mitallast »

Вижу некоторое непонимание того, что такое авторизация и сессия.

Оба - это способ предоставления аутентификации некоторого клиента к приложению.

Что такое авторизация? Это просто предоставление неких данных серверу, по которым сервер может идентицировать клиента ( например, используя компонент UserIdentity ).
Результатом авторизации является предоставление доступа к серверу. Такими данными могут быть: ссылка на регистрацию,пароль+логин, id сессии, одноразовый авторизационный токен, OpenId.

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

При авторизации доступ к серверу может быть как одноразовым, действительным только при единственном подключении к серверу. А может быть и длительным, который поддерживается между обращениями к серверу. Во втором случае все так-же необходимо идентифицировать пользователя, по данным, которые получены при идентификации.
Вот как раз этот способ и лежит в основе сессионного доступа.

Что такое сессия? Это длительное предоставление доступа к приложению по данным, выдаваемым сервером клиенту - например, ссылка на подтверждение регистрации или ID сессии, который передается веб-клиенту по кукам. При этом сам сервер должен обеспечивать постоянное или ограниченное по времени хранение сессионных данных.
В php есть встроенный механизм предоставления сессии, а также имеет api для возможности реализации своих сессий - очень часто в нагруженных проектах сессионные данные хранятся в memcached, mongodb, или просто в базе данных.

Как вы реализуете авторизацию - это ваш выбор. В своем примере я сделал одноразовую идентификацию. Точно также я мог и передавать не пароль с логином, а id сессии. Паттерн всегда один, меняется лишь транспорт передачи авторизационных данных.
Аватара пользователя
alexk984
Сообщения: 433
Зарегистрирован: 2010.10.21, 15:03
Контактная информация:

Re: аутентификация в веб-сервисах

Сообщение alexk984 »

Хочу поделиться своим решением. На стороне клиента я сохраняю стандартную аутентификацию, изменив только следующее

Код: Выделить всё

class UserIdentity extends CUserIdentity {
        private $_id;
        public function authenticate() {
        $ad = new AdService;
        $sess_id = $ad->Login('admin', 'admin');
            if($sess_id==='user not found')
                $this->errorCode=self::ERROR_USERNAME_INVALID;
            else{
                $this->_id=$sess_id;
                $this->errorCode=self::ERROR_NONE;
            }
        return !$this->errorCode;
        }
        public function getId() {
            return $this->_id;
        }
    } 
здесь создается soap клиент, затем вызывается метод сервиса Login который возвращает уникальный идентификатор юзера на время сессии (sess_id). Он сохраняется в сессии php. Вот метод Login сервиса

Код: Выделить всё

/**
         * @param string username пользователя
         * @param string password пользователя
         * @return string sess_id 
         * @soap
         */
        public function Login($username, $password) {
            $user = User::model()->find('name = "' . $username . '"');

            if (empty($user))
                return 'user not found';

            $sess_id = uniqid('', true);
            $user->sess_id = $sess_id;
            $user->save();

            return $sess_id;
        } 
После этого в куках я передаю этот id сервису используя метод __setCookie() soap-клиента, сервис проверяет куки

Код: Выделить всё

Yii::app()->request->cookies['UserId']->value; 
и если находит его в БД выполняет запрос клиента.
Ответить