Hallo,
ich suche mir hier jetzt schon n' Wolf ab, aber finde nichts dazu...also:
Ich muss einen PHP-WebService ansprechen, der mittels
SOAP-Header eine einfache Authorisierung verlangt. Ein PHP-Client kann sich wunderbar am Service autorisieren, nur unter Delphi bekomme ich es nicht gebacken. Der relevante Code des PHP-Clients sieht so aus:
Code:
class BasicAuth
{
private $username;
private $password;
public function __construct($username, $password)
{
$this->username = $username;
$this->password = $password;
}
}
// create basic authentication
$basicAuth = new BasicAuth('admin', '12345');
// expand
soap header w/ basic auth
$soapHeaders[] = new SoapHeader(WEBSERVICE_NAMESPACE, 'authenticate', $basicAuth);
// create
soap client...
$soap_client = new SoapClient(
WEBSERVICE_URI . '/' . WEBSERVICE_PATH . '?
wsdl',
array(
'trace' => 1,
'exceptions' => true
)
);
// ...and append own headers
$soap_client->__setSoapHeaders($soapHeaders);
Wenn ich jetzt in Delphi die
WSDL importiere, ist ein Zugriff auf die Header ja noch nicht drin. Also müsste man wohl ein eigenes RIO-Objekt erstellen...in etwa so:
Code:
type
TBasicAuth = class(TSOAPHeader)
private
FUsername: AnsiString;
FPassword: AnsiString;
public
property Username: AnsiString read FUsername write FUsername;
property Password: AnsiString read FPassword write FPassword;
end;
...
procedure TForm1.FormCreate(Sender: TObject);
var
RIO: THTTPRIO;
Header: TBasicAuth;
begin
RIO := THTTPRIO.Create(nil);
Header := TBasicAuth.Create;
Header.Username := 'admin';
Header.Password := '12345';
RIO.SOAPHeaders.Send(Header);
RIO.SOAPHeaders.SetOwnsSentHeaders(True);
...
MyService(False, '', RIO).myFunction(...);
end;
Das Problem an dieser Stelle ist, das ich wohl dem
SOAP-Header keinen Namen mitgeben kann - wie in PHP:
Code:
$soapHeaders[] = new SoapHeader(WEBSERVICE_NAMESPACE, 'authenticate', $basicAuth);
Hier wäre der Name "authenticate", der dann im
SOAP-Server über den HTTP/
SOAP-Header explizit aufgerufen wird:
Code:
public function authenticate($authValues)
{
$this->auth = ($authValues->username == 'admin') && ($authValues->password == '12345');
}
Da ich aber in Delphi nicht weiß, wie ich diesen Namen übergeben kann, ruft der Server die ensprechende Methode gar nicht erst auf, und die Anmeldung schlägt fehl.
Weiß einer Rat??
Danke & Gruß,
Marc