Autenticazione di base del client Java Web Service

Ho creato un servizio Web JAX-WS su Glassfish che richiede l’autenticazione HTTP di base.

Ora voglio creare un client Java per applicazioni standalone per quel servizio Web, ma non ho la minima idea di come passare il nome utente e la password.

Funziona con l’esploratore del servizio Web di Eclipse ed esaminando il cavo ho trovato questo:

POST /SnaProvisioning/SnaProvisioningV1_0 HTTP/1.1 Host: localhost:8080 Content-Type: text/xml; charset=utf-8 Content-Length: 311 Accept: application/soap+xml, application/dime, multipart/related, text/* User-Agent: IBM Web Services Explorer Cache-Control: no-cache Pragma: no-cache SOAPAction: "" Authorization: Basic Z2VybWFuOmdlcm1hbg== Connection: close      

Come faccio a passare il nome utente e la password in questa intestazione “Autorizzazione” usando il codice java? È un hash o qualcosa del genere? Qual è l’algoritmo?

Senza la sicurezza in questione ho un client java standalone funzionante:

 SnaProvisioning myPort = new SnaProvisioning_Service().getSnaProvisioningV10Port(); myPort.listServiceScripts(); 

Il modo JAX-WS per l’autenticazione di base è

 Service s = new Service(); Port port = s.getPort(); BindingProvider prov = (BindingProvider)port; prov.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "myusername"); prov.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "mypassword"); port.call(); 

Si è scoperto che esiste un modo semplice e standard per ottenere ciò che volevo:

 import java.net.Authenticator; import java.net.PasswordAuthentication; Authenticator myAuth = new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("german", "german".toCharArray()); } }; Authenticator.setDefault(myAuth); 

Nessuna class “sole” personalizzata o dipendenze esterne e nessuna codifica manuale.

Sono consapevole che la sicurezza BASIC non è, beh, sicura, ma stiamo utilizzando anche HTTPS.

per il client Axis2 questo può essere utile

 ... serviceStub = new TestBeanServiceStub(""); // Set your value HttpTransportProperties.Authenticator basicAuthenticator = new HttpTransportProperties.Authenticator(); List authSchemes = new ArrayList(); authSchemes.add(Authenticator.BASIC); basicAuthenticator.setAuthSchemes(authSchemes); basicAuthenticator.setUsername(""); // Set your value basicAuthenticator.setPassword(""); // Set your value basicAuthenticator.setPreemptiveAuthentication(true); serviceStub._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.AUTHENTICATE, basicAuthenticator); serviceStub._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.CHUNKED, "false"); ... 

Se stai utilizzando un’implementazione JAX-WS per il tuo client, come Metro Web Services, il codice seguente mostra come passare il nome utente e la password nelle intestazioni HTTP:

  MyService port = new MyService(); MyServiceWS service = port.getMyServicePort(); Map> credentials = new HashMap>(); credentials.put("username", Collections.singletonList("username")); credentials.put("password", Collections.singletonList("password")); ((BindingProvider)service).getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, credentials); 

Quindi le chiamate successive al servizio verranno autenticate. Fai attenzione che la password è codificata solo usando Base64, quindi ti incoraggio ad utilizzare altri meccanismi aggiuntivi come i certificati client per aumentare la sicurezza.

Qualche contesto aggiuntivo sull’autenticazione di base, consiste in un’intestazione che contiene la coppia chiave / valore:

Autorizzazione: base Z2VybWFuOmdlcm1hbg ==

dove ” Autorizzazione ” è la chiave delle intestazioni e il valore delle intestazioni ha una stringa (parola ” Base ” più spazio vuoto ) concatenata a ” Z2VybWFuOmdlcm1hbg == “, che sono l’ utente e la password nella base 64 congiunta con doppio punto

 String name = "username"; String password = "secret"; String authString = name + ":" + password; String authStringEnc = new BASE64Encoder().encode(authString.getBytes()); ... objectXXX.header("Authorization", "Basic " + authStringEnc); 

Per semplificarti la vita, potresti prendere in considerazione l’utilizzo di framework JAX-WS come Apache CXF o Apache Axis2.

Ecco il link che descrive come configurare WS-Security per Apache CXF -> http://cxf.apache.org/docs/ws-security.html

MODIFICA A proposito, il campo Authorization utilizza solo la semplice codifica Base64. Secondo questo ( http://www.motobit.com/util/base64-decoder-encoder.asp ), il valore decodificato è german:german .

come me funciono:

 BindingProvider bp = (BindingProvider) port; Map map = bp.getRequestContext(); map.put(BindingProvider.USERNAME_PROPERTY, "aspbbo"); map.put(BindingProvider.PASSWORD_PROPERTY, "9FFFN6P");