Java >> Java Tutorial >  >> Java

Verwendung von OAuth-gesichertem SOAP-Webdienst

Ich hatte dieses Problem, bei dem ich einen SOAP-Dienst nutzen musste, der durch OAuth1.0a gesichert war. Und Spring bietet keine direkte Lösung für die Verwendung von OAuth-gesicherten SOAP-Webdiensten.

In Producing and Consuming SOAP web service und Consuming SOAP web service over HTTPS haben wir gesehen, wie man einen SOAP-Webdienst nutzt. In diesem Beitrag werden wir etwas darüber hinausgehen und eine Lösung implementieren, um den OAuth-gesicherten SOAP-Webdienst zu nutzen. Das Sichern eines Webdienstes ist ein allgemeiner Trend, und Sie müssen einen Webdienst sichern, wenn Sie anderen erlauben, ihn zu nutzen. Dies ist eine sichere Möglichkeit, Daten zwischen Erzeuger und Verbraucher zu übertragen, ohne die Kundendaten zu gefährden.

Voraussetzungen

  1. Spring-Webdienste
  2. OAuth-Bibliothek und -Wissen

Wie implementiert man es?

Zunächst ist unten ein Code, der zeigt, wie ein SOAP-Anforderungsaufruf an einen Webdienst gesendet wird, wenn dieser nicht OAuth-gesichert ist.


public class UserClient extends WebServiceGatewaySupport
{
   public GetUserResponse getUserById (int userid)
   {
      GetUserRequest userrequest = new GetUserRequest();
      userrequest.setId(userid);
      GetUserResponse response = (GetUserResponse)getWebServiceTemplate().marshalSendAndReceive(userrequest, new 
       SoapActionCallback("https://localhost:8443/benefits/endpoints/getUserResponse"));
      return response;
   }
}

Wir verwenden ein WebServiceTemplate um eine Anfrage zu marshallen und an einen SOAP-Endpunkt zu senden. SoapActionCallback ist ein Rückruf, der es ermöglicht, die gemarshallte Nachricht zu ändern und an einen Endpunkt zu senden und dann eine Antwort abzurufen.

Zweitens werden wir als Teil dieser Lösung eine Klasse SignedMessageSender implementieren, die die Anfrage mit OAuth-Verbraucherschlüssel und -geheimnis signiert.


public class SignedMessageSender extends HttpComponentsMessageSender
{
   private final CommonsHttpOAuthConsumer consumer;

   public SignedMessageSender(CommonsHttpOAuthConsumer consumer)
   {
     this.consumer = consumer;
   }

   public WebServiceConnection createConnection(URI uri)
   {
     HttpComponentsConnection conn = null;
     try
     {
       conn = (HttpComponentsConnection)super.createConnection(uri);
       consumer.sign(connection.getHttpPost());
     }
     catch (IOException e | OAuthException e)
     {
      throw new RuntimeException("I/O Error", e);
     }
    return conn;
  }
}

Jetzt bauen wir unsere Bean für den Client, um diesen Nachrichtensender zu verwenden. Dann weisen wir einen Verbraucherschlüssel und ein Verbrauchergeheimnis zu. Dies verwendet auch JAXB marshaller . Der Code dafür sieht wie folgt aus


@Bean
public UserClient getUserClient(Jaxb2Marshaller marshaller)
{
   UserClient us = new UserClient();
   us.setDefaultUri("https://localhost:8443/benefits/endpoints/users.wsdl");
   us.setMarshaller(marshaller);
   us.setUnmarshaller(marshaller);
   String consumerkey = "";
   String secretkey = "";
   CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(consumerkey,secretkey);
   SignedMessageSender signedMessageSender = new SignedMessageSender(consumer);
   signedMessageSender.createConnection(new URL("https://localhost:8443/benefits/endpoints/users.wsdl").toURI());
   us.setMessageSender(signedMessageSender);
   return us;
}

Dies zeigt, wie wir eine Lösung implementieren können, um einen mit OAuth 1.0a gesicherten SOAP-Webdienst zu nutzen . Ich bin sicher, dass wir eine ähnliche Lösung hinzufügen können, wenn der Dienstersteller sie mit OAuth 2.0, sichert aber das ist ein anderer Beitrag.

Schlussfolgerung

Abschließend habe ich gezeigt, wie man eine OAuth-signierte SOAP-Nachricht an den SOAP-Webservice sendet.

Referenzen

  1. Kopfzeile zu SOAP-Nachricht hinzufügen
  2. SOAP WS-Adressierung
  3. https://www.avisi.nl/blog/2012/11/22/konsumierende-oauth-secured-soap-webservices-using-spring-ws-axiom-signpost/

Java-Tag