it-swarm.com.de

Jersey Client API - Authentifizierung

Ich verwende die Jersey-Client-API, um SOAP -Anfragen an einen JAX-WS-Webservice zu senden. Standardmäßig verwendet Jersey meine Windows NT-Anmeldeinformationen zur Authentifizierung, wenn Sie dazu aufgefordert werden. Kann jemand erklären, wo Jersey das im Code tut? Und kann es überschrieben werden?

Ich habe versucht, HTTPBasicAuthFilter zu verwenden und als Filter auf dem Client hinzuzufügen. Ich habe auch versucht, meine Anmeldeinformationen zum Feld WebResoruce queryParams hinzuzufügen. Beide werden jedoch nicht abgeholt.

45
cduggan

Zuerst bekam ich diese Funktion, wie im Jersey-Benutzerhandbuch beschrieben

Authenticator.setDefault (authinstance);

Dies hat mir jedoch nicht gefallen, da es darauf abhing, einen globalen Authentifikator zu setzen. Nach einigen Recherchen entdeckte ich, dass Jersey eine HTTPBasicAuthFilter hat, die noch einfacher zu bedienen ist.

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

Siehe: 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);

Verweis: 5.9.1. HTTP-Authentifizierungsunterstützung

Im Jersey-Benutzerhandbuch gibt es einen kleinen Abschnitt über Client-Authentifizierung . Ich würde empfehlen, dass Sie seinem Ratschlag folgen und versuchen, Apache HTTP Client anstelle von HttpURLConnection zu verwenden, da dies für alles, was Sie tun möchten, viel bessere Unterstützung bietet.

12
Ryan Stewart

Ich füge diese Antwort hinzu, da ich immer wieder Antworten für ältere Jersey-Versionen finde, die in 2.x nicht mehr relevant sind.

Für Jersey 2 gibt es mehrere Möglichkeiten. Schauen Sie sich an: 

JavaDoc für org.glassfish.jersey.client.authentication.HttpAuthenticationFeature

Hier ist derjenige, der für mich arbeitet (einfachste auth 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

Wenn Sie eine Dropwizard-Anwendung testen (möglicherweise entspricht sie jedem REST - Dienst), können Sie dies als Beispiel verwenden: https://github.com/dropwizard/dropwizard/blob/v0.8.1 /dropwizard-auth/src/test/Java/io/dropwizard/auth/basic/BasicAuthProviderTest.Java

1
Thiago

Ja, für Trikot 2.x können Sie dies tun, um jede Anfrage mit der Basisauthentifizierung (preemptive mode) zu authentifizieren: 

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

Den folgenden Funktionscode finden Sie ohne SSL 

Ich verwende Put-Anfrage, wenn nötig post/get es gerade ändern.

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>

Java-Klasse

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;
    }

}
0
vaquar khan