Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi PHP konforme SOAP Header erzeugen, wie? (https://www.delphipraxis.net/171012-php-konforme-soap-header-erzeugen-wie.html)

kaju74 15. Okt 2012 15:25

PHP konforme SOAP Header erzeugen, wie?
 
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

Keldorn 15. Okt 2012 17:32

AW: PHP konforme SOAP Header erzeugen, wie?
 
Hallo,

hast du es auch bereits mit der "normalen" Variante
Delphi-Quellcode:
  Rio.HTTPWebNode.UserName:='xycyx';
  Rio.HTTPWebNode.Password:='hhfg';
probiert?

gruß frank

mjustin 15. Okt 2012 17:36

AW: PHP konforme SOAP Header erzeugen, wie?
 
Username und Passwort für HTTP Basic sind Properties der Delphi THTTPRio Komponente bzw. der HTTPWebNode Subkomponente.

Delphi-Quellcode:
   HTTPrio.HTTPWebNode.UserName:='username';
   HTTPrio.HTTPWebNode.Password := 'password';
Testen kann man das, indem man einen Browser auf die WSDL URL gehen läßt. Wenn dann der Login-Dialog aufpoppt, hat man quasi die Bestätigung dass es eine Basic Auth ist. Wenn in dem Dialog die Anmeldung mit diesen Credentials funktioniert, braucht man keine speziellen SOAP Request Header.

Nachtrag: um nachzuvollziehen was der PHP Client genau an den Service sendet, kann man Fiddler als Proxy dazwischenschalten.
Wenn man dann den Delphi SOAP Request zusammenbaut kann man ebenfalls Fiddler dazwischenschalten um die Übereinstimmung nachzuprüfen.

mjustin 15. Okt 2012 17:50

AW: PHP konforme SOAP Header erzeugen, wie?
 
ups, doppelt gepostet...

kaju74 16. Okt 2012 15:21

AW: PHP konforme SOAP Header erzeugen, wie?
 
Hi.

Danke...aber, der Name täuscht: Es handelt sich nicht um eine Basic-Authentification sondern um eine individuelle über SOAP-Headers (siehe PHP-Code), d.h.: im Header wird eine entsprechende Struktur benötigt, die ich mit Delphi (2010) so nicht hinbekomme....Statt Username und Password könnte es auch Hugo, Egon und Susi mit entsprechenden Werten heißen. Wichtig ist hierbei der Name "authenticate", die dieser Header haben muss!

Gruß,
Marc

mjustin 17. Okt 2012 06:04

AW: PHP konforme SOAP Header erzeugen, wie?
 
Zitat:

Zitat von kaju74 (Beitrag 1187285)
Wichtig ist hierbei der Name "authenticate", die dieser Header haben muss

Ok, aber wie sieht der effektive Unterschied zwischen den Delphi und den PHP Requests aus?
Das sollte mit Fiddler leicht zu ermitteln sein. Danach muss man den Unterschied im Delphi Request passend "nachbessern".

kaju74 17. Okt 2012 13:09

AW: PHP konforme SOAP Header erzeugen, wie?
 
Hi.

Muss ich mal schauen...melde mich dann wieder...schonmal Danke...

Gruß,
Marc


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz