Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> через PHP к JBoss wsdl Facade, "ошибка авторизации" 
:(
    Опции темы
sysprog
  Дата 15.5.2008, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 9.8.2007

Репутация: нет
Всего: нет



Добрый день.

Столкнулся с подобной задачей, сервер-фасад JBoss, а клиент - PHP5 стандартный php_soap.dll

Подключиться к фасаду получается, но затем при вызове методов возникают ошибка авторизации:
SecurityException; nested exception is: 
    javax.security.auth.login.LoginException: Login Failure: all modules ignored

Исходя из того как ребята делали это на С# понял, что при вызове методов еще необходимо передавать sessionId в заголовке, и в этом вся загвоздка.
Код

    RemoteFacade.SessionHeaderValue = new SessionHeader();
    RemoteFacade.SessionHeaderValue.sessionId = 
                              RemoteFacade.login(lf.Login, lf.Password);


Вот несколько вариантов попытки вызова метода фасада на PHP через Soap.

1 Вариант. При создании объекта сразу передается логин и пароль:
Код

$client = new SoapClient($wsdl, array(
    "login"      => "superuser",
    "password"   => "",
    "trace"      => 1,
    "exceptions" => 0));

$curr = $client->__call("getCurrency", array("UAH"));
// выдается указанная выше ошибка



2 Вариант. Используем объект SoapHeader:
Код

$client = new SoapClient($wsdl,     
    "trace"          => 1,
    "exceptions" => 0);

$header = new SoapHeader("Authorization",
                           "sessionId",
                           $client->__call("login", array("superuser", ""))); // Получаем sessionId и пытаемся присвоить переменной из Namespace=Authorization (первый параметр)

$curr = $client->__call("getCurrency", array("UAH"), null, $header);
// выдается указанная выше ошибка


Подозреваю, что в этом случае может быть ошибка с установкой Namespace=Authorization, т.к. не исключено, что в Jboss Namespace будет другой. (Использовал по аналогии с примерами на других платформах, надеялся, может везде стандартный)

3 Вариант. Используем недокументированную функцию __setSoapHeaders
Код

$client = new SoapClient($wsdl,     
    "trace"          => 1,
    "exceptions" => 0);

$header = new SoapHeader( "Authorization", "sessionId", (string) $client->__call("login", array("superuser", "")));
$client->__setSoapHeaders(array($header)); // нормально устанавлива

$curr = $client->__call("getCurrency", array("UAH"));
// выдается указанная выше ошибка



Помогите, пожалуйста, нахожусь в полном замешательстве.  smile 
Вроде бы перерыл и перечитал все :(

PM MAIL   Вверх
Fortop
Дата 15.5.2008, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



sysprog
ссылку на WSDL файл

Добавлено через 11 секунд
в смысле покажи


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
sysprog
Дата 15.5.2008, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 9.8.2007

Репутация: нет
Всего: нет



Fortop, В локальной сети! :(


PM MAIL   Вверх
sTa1kEr
Дата 15.5.2008, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



Цитата(sysprog @  15.5.2008,  18:56 Найти цитируемый пост)
$curr = $client->__call("getCurrency", array("UAH"));

Метод __call устарел, вместо него следует использовать метод  __soapCall()

Цитата(sysprog @  15.5.2008,  18:56 Найти цитируемый пост)
1 Вариант. При создании объекта сразу передается логин и пароль:

Это не правильно. Под паролем и логином тут имеются ввиду логин и пароль для HTTP авторизации, в случае если WSDL схема находится под паролем. Хидеры же надо передавать каждый раз при вызове метода __soapCall(), как у вас это сделано во втором варианте.

Цитата(sysprog @  15.5.2008,  18:56 Найти цитируемый пост)
Подозреваю, что в этом случае может быть ошибка с установкой Namespace=Authorization, т.к. не исключено, что в Jboss Namespace будет другой. (Использовал по аналогии с примерами на других платформах, надеялся, может везде стандартный)

Естественно, для каждого веб сервиса будет свой namespace. Кроме того он должен быть иметь тип xs:anyURI, а не строки.
http://www.w3.org/TR/wsdl20/#Description_t...space_attribute
Цитата

The type of the targetNamespace attribute information item is xs:anyURI. Its value MUST be an absolute IRI (see [IETF RFC 3987]) and should be dereferencable.



PM MAIL   Вверх
sysprog
Дата 12.6.2008, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 9.8.2007

Репутация: нет
Всего: нет



Хех, перепробовал много чего... но в итоге помогли старшие товарищи! smile За что им большой респект!

sTa1kEr, спасибо за толковый ответ!!
Код


$wsdl = "http://somesite/doc?wsdl";

$client = new SoapClient($wsdl,array('trace'=>true));

$session_id = $client->__call("login", array("user",'pass'));
 
$strHeaderSession = "<SessionHeader><sessionId>$session_id</sessionId></SessionHeader>";
$objVar = new SoapVar($strHeaderSession, XSD_ANYXML, null, null, null);
$objHeader = new SoapHeader($wsdl, 'SessionHeader', $objVar);

$client->__setSoapHeaders(array($objHeader));

$arrParameters_Query = array('in0' => "UAH");
$objResponse = $client->getCurrency($arrParameters_Query);



По-моему, с SessionId довольно криво, но по другому не работает!..

PM MAIL   Вверх
Fortop
Дата 13.6.2008, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



sysprog
читай заголовки после авторизации и сохраняй кукисы оттуда

затем soap->__setCookies()

Код

// тут была авторизация
        $hdr  = self::$client->__getLastResponseHeaders();
        $list = explode("\r\n",$hdr);
        foreach($list as $line) {
            if (false !== strpos($line, 'Set-Cookie:')) {
                $subline         = substr($line, 12);
                list($key, $val) = explode('=', $subline, 2);
                list($val,)      = explode(';', $val);
                $cookie[$key]    = $val;
                break;
            }
        }
        self::$client->__setCookie($key, $cookie[$key]);



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0737 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.