JAX-WS vs SOAP:HEADER

Do uwierzytelniania w webserwisach często stosowało się HTTP Authentication (RFC 2617). Jest to sposób przesyłania danych uzytkownika uzależniony od protokołu (w nagłówko HTTP). We współczesnych aplikacjach wykorzystujących usługi sieciowe jest to niedopuszczalne. Wiadomość SOAP może na przykład iść od konsumenta usługi poprzez firewall XML do ESB i wtedy do kolejki komunikatów, z niej do kolejnego ESB aby być wkońcu skierowana do serwera dostawcy usług. W takiej sytuacji przesyłanie danych uwierzytelniających w nagłówku zupełnie się nie sprawdza nie mówiąc już o niższych warstwach jak SSL (RFC 2246). Stostuje się do tego przesyłanie danych związanych z bezpieczeństwem w nagłówku SOAP. Istnieje standard to normalizujący (WS-Security) ale jest stosunkowo nowy (1.0 marzec 2004, 1.1 luty 2006) i wiele usług korzysta z własnych rozwiązań.

Pisząc klienta dla usług sieciowych dla agencji kredytowych udostępnianych przez Bank Millenium spotkałem się właśnie z takim rozwiązaniem. Do generacji klienta używałem wsimport. Serwer jest oparty na platormie .NET. Po wykonaniu odpowiedniej jaxb customization udało mi się wkońcu wygenerować działającego klienta. wsimport wygenerował odpowiednie klasy do przesyłania hasła i nazwy użytkownika, ale nie podał ich jako parametry metod jak jest to wskazane w wsdl-u. Jest to znany błąd. Można używać specjalnych callbacków udostępniających całą wiadomość SOAP i modyfikować header. Można też użyć do tego celu plików konfiguracyjnych dla wsimport. Istnieje jednak znacznie prostsze rozwiązanie. Można po prostu ręcznie zmodyfikować kod interfejsu klienta używając parametru header w anotacji @WebParam. Potrzebne klasy są już wygenerowane przez wsimport. Dla przykładu:

Wygenerowana przez wsimport metoda moze wyglądać tak:

public void method1(
@WebParam(name = "FirstParam", targetNamespace = "ns1")
FirstParam firstParam);

Oprócz klasy FirstParam wsimport wygenerował klasę Credentials której zawartość powinna się znaleźć w nagłówku wiadomości wysyłanej przez tą metodę. Wystarczy dodać parametr (ważne jest header = true w anotacji):

public void method1(
@WebParam(name = "UserCredentials", targetNamespace = "ns1", header = true)
Credentials userCredentials,
@WebParam(name = "FirstParam", targetNamespace = "ns1")
FirstParam firstParam);

Wysyłanego xmla można łatwo podejrzeć na konsoli ustawiając:

System.setProperty("com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump", "true");

Widać, że parametr metody znalazł się w naglówku SOAP.

Zacheusz Siedlecki

Komentarze

Chcesz coś napisać?





*