web-dev-qa-db-fra.com

API client Jersey - authentification

J'utilise l'API client Jersey pour soumettre SOAP des requêtes à un service Web JAX-WS. Par défaut, Jersey utilise en quelque sorte mes informations d'identification Windows NT pour l'authentification lorsqu'elle est défiée. Quelqu'un peut-il expliquer où Jersey fait cela dans le code? Et peut-il être annulé?

J'ai essayé d'utiliser HTTPBasicAuthFilter et de l'ajouter en tant que filtre sur le client. J'ai également essayé d'ajouter mes informations d'identification au champ WebResoruce queryParams, mais aucun d'entre eux n'est capturé.

45
cduggan

Au début, cela fonctionnait comme indiqué dans le guide de l'utilisateur du Jersey

Authenticator.setDefault (authinstance);

Cependant, je n’ai pas aimé cela car il s’agissait de définir un authentificateur global. Après quelques recherches, j'ai découvert que Jersey a une HTTPBasicAuthFilter qui est encore plus facile à utiliser.

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

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

71
iain

Jersey 2.x:

HttpAuthenticationFeature feature = HttpAuthenticationFeature.basicBuilder()
    .nonPreemptive()
    .credentials("user", "password")
    .build();

ClientConfig clientConfig = new ClientConfig();
clientConfig.register(feature) ;

Client client = ClientBuilder.newClient(clientConfig);

Référence: 5.9.1. Prise en charge de l'authentification HTTP

32

Le guide de l’utilisateur de Jersey contient une petite section sur Authentification du client . Je vous recommande de suivre ses conseils et d'essayer d'utiliser Apache HTTP Client au lieu de HttpURLConnection, car il offre une meilleure prise en charge de tout ce que vous souhaitez faire.

12
Ryan Stewart

En ajoutant cette réponse, je continue de chercher des réponses pour les anciennes versions de Jersey qui ne sont plus pertinentes dans la version 2.x.

Pour Jersey 2, il y a plusieurs façons. Jeter un coup d'œil à: 

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

Voici celui qui fonctionne pour moi (la plus simple des autorisations de base IMHO).

    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) );
2
Michael Pawlowsky

Si vous testez une application Dropwizard (cela convient peut-être à tout service REST), vous pouvez utiliser ceci à titre d'exemple: https://github.com/dropwizard/dropwizard/blob/v0.8.1 /dropwizard-auth/src/test/Java/io/dropwizard/auth/basic/BasicAuthProviderTest.Java

1
Thiago

Oui, pour le maillot 2.x, vous pouvez authentifier chaque requête avec l’authentification de base (mode préventif): 

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

Veuillez trouver le code de travail suivant sans SSL 

J'utilise put demande, si besoin poster/get juste le changer.

pom.xml

<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.javacodegeeks.enterprise.rest.jersey</groupId>
    <artifactId>JerseyJSONExample</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <repositories>
        <repository>
            <id>maven2-repository.Java.net</id>
            <name>Java.net Repository for Maven</name>
            <url>http://download.Java.net/maven/2/</url>
            <layout>default</layout>
        </repository>
    </repositories>

    <dependencies>

        <dependency>
            <groupId>com.Sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>1.9</version>
        </dependency>

        <dependency>
            <groupId>com.Sun.jersey</groupId>
            <artifactId>jersey-client</artifactId>
            <version>1.9</version>
        </dependency>

        <dependency>
            <groupId>com.Sun.jersey</groupId>
            <artifactId>jersey-json</artifactId>
            <version>1.9</version>
        </dependency>

    </dependencies>

</project>

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 = "p@ssword";


            //{"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;
    }

}
0
vaquar khan