SoapClient WSDL SoapServer авторизация пользователя

BoBka-altRUist

Новичок
SoapClient WSDL SoapServer авторизация пользователя

Судя по описаниям в разных мануалах
клиент который подключается к серверу может использовать доп. параметры new SoapClient("адрес wsdl-файла", массив_доп.параметров);
вот пример взятый отсюда http://php.su/articles/?cat=pear&page=004

PHP:
<?php
  $client = new SoapClient("stockquote1.wsdl",array(
    "trace"      => 1,
    "exceptions" => 0));
  $client->getQuote("ibm");
  print "<pre>\n";
  print "Запрос :\n".htmlspecialchars($client->__getLastRequest()) ."\n";
  print "Ответ:\n".htmlspecialchars($client->__getLastResponse())."\n";
  print "</pre>";
?>
также судя по описанию из php.net в список этих доп параметров входят login и password :

http://ru2.php.net/manual/en/soapclient.soapclient.php

PHP:
$client = new SoapClient("some.wsdl", array('login'          => "some_name",
                                            'password'       => "some_password"));

скажите, как я могу получить эти login и password на своем сервере? (мне нужно определить что это за юзер и отдать ему его данные) (сервер работает именно с wsdl)

-~{}~ 08.08.10 19:18:

да, чтобы было понятнее, вот пример сервера (выкинул оттуда все чтобы не напрягать)

PHP:
class Api_Controller extends Controller {

	const ALLOW_PRODUCTION = TRUE;

	private $user;
	private $password;
	
	public function index()
	{
        function getF() {
        }
       
        function getC() {
        }

        ini_set("soap.wsdl_cache_enabled", "0");
        $server = new SoapServer("http://xxxxdfsf.su/apix/api.wsdl?" . rand()); 
        $server->addFunction("getF");
        $server->addFunction("getC");              
        $server->handle();
	}
}
 

kaliostro

Новичок
можно пример Soap сервера с авторизацией по дополнительным параметрам.
При таком инициализации
PHP:
$client = new SoapClient("some.wsdl", array('login'          => "some_name", 
                                            'password'       => "some_password"));
На сервере нету заголовков basic авторизации и я не вижу как можно считать эти данные авторизации.
 

Sender

Новичок
ну собственно, если это и передается, то только в $_SERVER, var_dump его и смотри есть ли там твой логин пароль где-нибудь. Можешь для успокоения совести еще все возможные входные данные просветить (input, get, post, request) и т.п.

Если не найдутся, то видимо самому передавать эту информацию в soap-запросе. Вроде даже soap header для этого можно попробовать использовать

вообще вроде даже при отсутствии basic авторизации в PHP_AUTH_USER и PHP_AUTH_PW данные должны присутствовать, могу ошибаться конечно, надо экспериментировать :)
 

MiRacLe

просто Чудо
Чтобы клиент передавал учётные данные, необходимо чтобы сервер их запросил.

В общем случае это выглядит так:

PHP:
if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="My Realm"');
    header('HTTP/1.0 401 Unauthorized');
    exit;
} else {
     $server = new SoapServer(/*......*/);
    if ('trusted-user' == $_SERVER['PHP_AUTH_USER'] && 'secret' == $_SERVER['PHP_AUTH_PW']) {
       $server->handle();
    } else {
       $server->fault(403,'Access denied');
    } 
}
Ещё раз - http://php.net/http-auth
 

kaliostro

Новичок
Если я на сервере прописываю запрос авторизации
PHP:
if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="My Realm"');
    header('HTTP/1.0 401 Unauthorized');
    exit;
}
ТО клиент выдаёт ошибку
Uncaught SoapFault exception: [HTTP] Unauthorized in
Хоть и данные передаю при подключении в опциях
PHP:
array('login'=> 'fdfdsfsd', 'passwod' => 'fdfdfd')
 

MiRacLe

просто Чудо
Предлагаю для начала просто разобраться с авторизацией в отрыве от SoapClient-а - http://php.net/http-auth.

Подозреваю, что у вас в $_SERVER нет PHP_AUTH_USER, в комментариях на php.net рассмотрена большая часть проблем, которые случаются на разных серверах с "кривыми настройками" и даны ЦУ на все случаи жизни.

От себя - в ряде случаев, спасала явная передача заголовков из окружения вебсервера в php через .htaccess/httpd.conf:

SetEnvIf Authorization "(.*)" PHP_AUTH_DIGEST=$1
С последующим разбором $_SERVER['PHP_AUTH_DIGEST'] на сервере.
 

kaliostro

Новичок
спс, оказывается пхп у меня работает как FastCGI, вот тут и не нету поддержки $_SERVER['PHP_AUTH_USER']
 
Сверху