Jersey Client API – autenticazione

Sto utilizzando l’API client di Jersey per inviare richieste SOAP a un servizio web JAX-WS. Per impostazione predefinita, Jersey utilizza in qualche modo le credenziali di Windows NT per l’autenticazione in caso di problemi. Qualcuno può spiegare dove Jersey fa questo nel codice? E può essere annullato?

Ho provato a utilizzare HTTPBasicAuthFilter e ad aggiungere come filtro sul client. Ho anche provato ad aggiungere le mie credenziali al campo WebResoruce queryParams, ma nessuno dei due viene prelevato.

All’inizio ho avuto questo lavoro come documentato nella guida dell’utente di Jersey

Authenticator.setDefault (authinstance); 

Tuttavia non mi è piaciuto perché si basava sull’impostazione di un autenticatore globale. Dopo alcune ricerche ho scoperto che Jersey ha un HTTPBasicAuthFilter che è ancora più facile da usare.

 Client c = Client.create(); c.addFilter(new HTTPBasicAuthFilter(user, password)); 

Vedi: https://jersey.github.io/nonav/apidocs/1.10/jersey/com/sun/jersey/api/client/filter/HTTPBasicAuthFilter.html https://jersey.github.io/nonav/apidocs/1.10 /jersey/com/sun/jersey/api/client/filter/Filterable.html#addFilter(com.sun.jersey.api.client.filter.ClientFilter)

Jersey 2.x:

 HttpAuthenticationFeature feature = HttpAuthenticationFeature.basicBuilder() .nonPreemptive() .credentials("user", "password") .build(); ClientConfig clientConfig = new ClientConfig(); clientConfig.register(feature) ; Client client = ClientBuilder.newClient(clientConfig); 

Riferimento: 5.9.1. Supporto di autenticazione Http

C’è una piccola sezione nella guida dell’utente di Jersey sull’autenticazione del client . Ti consigliamo di seguire i suoi consigli e provare ad utilizzare Apache HTTP Client invece di HttpURLConnection, in quanto ha un supporto molto migliore per qualsiasi cosa tu voglia fare.

Aggiungendo questa risposta man mano che continuo a trovare le risposte per le versioni precedenti di Jersey che non sono più rilevanti in 2.x.

Per il Jersey 2 ci sono diversi modi. Dare un’occhiata a:

JavaDoc per org.glassfish.jersey.client.authentication.HttpAuthenticationFeature

Ecco quello che funziona per me (la più semplice IMHO di base).

  ClientConfig config = new ClientConfig(); HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("username", "password"); Client client = ClientBuilder.newClient(config); client.register(feature); WebTarget webTarget = client.target("http://api.asite.com/api").path("v1/reports/list"); Invocation.Builder invocationBuilder = webTarget.request(MediaType.TEXT_PLAIN_TYPE); Response response = invocationBuilder.get(); System.out.println( response.getStatus() ); System.out.println( response.readEntity(String.class) ); 

Se stai testando un’applicazione Dropwizard (forse si adatta a qualsiasi servizio REST), puoi utilizzare questo esempio: https://github.com/dropwizard/dropwizard/blob/v0.8.1/dropwizard-auth/src/test/ java / io / dropwizard / auth / base / BasicAuthProviderTest.java

Si prega di trovare il seguente codice di lavoro senza SSL

Sto usando la richiesta put, se hai bisogno di post / basta cambiarla.

pom.xml

  4.0.0 com.javacodegeeks.enterprise.rest.jersey JerseyJSONExample 0.0.1-SNAPSHOT   maven2-repository.java.net Java.net Repository for Maven http://download.java.net/maven/2/ default     com.sun.jersey jersey-server 1.9   com.sun.jersey jersey-client 1.9   com.sun.jersey jersey-json 1.9    

Classe Java

 package com.rest.jersey.jerseyclient; import com.rest.jersey.dto.Employee; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; import com.sun.jersey.api.client.config.ClientConfig; import com.sun.jersey.api.client.config.DefaultClientConfig; import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter; import com.sun.jersey.api.client.filter.LoggingFilter; import com.sun.jersey.api.json.JSONConfiguration; public class JerseyClient { public static void main(String[] args) { try { String username = "username"; String password = "[email protected]"; //{"userId":"12345","name ":"Viquar","surname":"Khan","email":"[email protected]"} Employee employee = new Employee("Viquar", "Khan", "[email protected]"); ClientConfig clientConfig = new DefaultClientConfig(); clientConfig.getFeatures().put( JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); Client client = Client.create(clientConfig); // final HTTPBasicAuthFilter authFilter = new HTTPBasicAuthFilter(username, password); client.addFilter(authFilter); client.addFilter(new LoggingFilter()); // WebResource webResource = client .resource("http://localhost:7001/VaquarKhanWeb/employee/api/v1/informations"); ClientResponse response = webResource.accept("application/json") .type("application/json").put(ClientResponse.class, employee); if (response.getStatus() != 200) { throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); } String output = response.getEntity(String.class); System.out.println("Server response .... \n"); System.out.println(output); } catch (Exception e) { e.printStackTrace(); } } } 

POJO

 package com.rest.jersey.dto; public class Employee { private String name; private String surname; private String email; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "Employee [name=" + name + ", surname=" + surname + ", email=" + email + "]"; } public Employee(String name, String surname, String email) { super(); this.name = name; this.surname = surname; this.email = email; } } 

Sì per la maglia 2.x puoi farlo per autenticare ogni richiesta con l’autenticazione di base (modalità preventiva):

  client.register(HttpAuthenticationFeature.basic(userName, password)); // rest invocation code ..