# Basic Authentication



## Patrick123 (19. Okt 2017)

Hallo zusammen,

ich kenne mich mit folgendem nicht so gut aus und hoffe, dass man versteht was ich meine:
Ich würde gerne auf eine Seite zugreifen bei der man sich über Basic Authentication anmelden muss. Wenn man die richtigen Login-Daten eingibt erscheint im Browser eine .json Datei. Diese würde ich dann gerne auslesen.
Mein bisheriger Code sieht folgendermaßen aus:

```
public class Connection {
    public static void main(String[] args) throws IOException, URISyntaxException{
    String benutzername = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    String passwort = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    String identnr = "R901358810_B7_933";
   
    UsernamePasswordCredentials creds = new UsernamePasswordCredentials(benutzername, passwort);
    System.out.println("User: "+creds.getUserPrincipal().getName());
    System.out.println("Password: "+creds.getPassword());
   
    String authString = benutzername + ":" + passwort;
    System.out.println("auth string: " + authString);
    byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
    String authStringEnc = new String(authEncBytes);
    System.out.println("Base64 encoded auth string: " + authStringEnc);
   
    URI uri = new URIBuilder()
            .setScheme("https")
            .setHost("xxxxxxxxxxxxxxxxxxx.com")
            .setPath("/api/v1/exemplar/serialnumber")
            .setParameter("identnumber", identnr).build();
    CloseableHttpClient httpclient = HttpClients.createDefault();
    HttpGet httpGet = new HttpGet(uri);
    System.out.println(httpGet.getURI());
    HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
            HttpStatus.SC_OK, "OK");

            System.out.println(response.getProtocolVersion());
            System.out.println(response.getStatusLine().getStatusCode());
            System.out.println(response.getStatusLine().getReasonPhrase());
            System.out.println(response.getStatusLine().toString());
   
            System.out.println(
            Request.Get(uri)
            .connectTimeout(1000)
            .socketTimeout(1000)
            .execute().returnContent().asString());   
    }
}
```
Der ein oder andere Teil ist wahrscheinlich überflüssig - habe ich aber zum Probieren genutzt.
Ich bekomme einen Fehler bei der letzten Zeile:

```
Request.Get(uri)
            .connectTimeout(1000)
            .socketTimeout(1000)
            .execute().returnContent().asString()
```
Wie schon erwähnt habe ich leider nicht so viel Erfahrung damit.
Ich arbeite mit der Apache HttpClient Library (http://hc.apache.org/downloads.cgi)

Würde mich sehr über Anregungen und Tipps freuen!
Vielen Dank schonmal.

Gruß
Patrick


----------



## VfL_Freak (19. Okt 2017)

Moin,


Patrick123 hat gesagt.:


> Ich bekomme einen Fehler bei der letzten Zeile


prima 
Ist das ein Ratespiel oder warum verrätst Du nicht, um welchen Fehler es sich handelt ?? 

VG Klaus

*EDIT:* 
mal so nebenbei gefragt :
was ist _*Request*_??
und was erwartet die _*get*_-Methode als Parameter??


----------



## Patrick123 (19. Okt 2017)

Konsolenausgabe:

```
...
Exception in thread "main" java.net.UnknownHostException: xxxxxxxxxxxxxxxxxxxxxxx.com
   at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
   at java.net.InetAddress$2.lookupAllHostAddr(Unknown Source)
   at java.net.InetAddress.getAddressesFromNameService(Unknown Source)
   at java.net.InetAddress.getAllByName0(Unknown Source)
   at java.net.InetAddress.getAllByName(Unknown Source)
   at java.net.InetAddress.getAllByName(Unknown Source)
   at org.apache.http.impl.conn.SystemDefaultDnsResolver.resolve(SystemDefaultDnsResolver.java:45)
   at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:112)
   at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:359)
   at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:381)
   at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:237)
   at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
   at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
   at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111)
   at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
   at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
   at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
   at org.apache.http.client.fluent.Request.internalExecute(Request.java:173)
   at org.apache.http.client.fluent.Request.execute(Request.java:177)
   at com.xxxxx.xxxxx.consoleclient.Connection.main(Connection.java:78)
```
Connection.java:78 ist in dem Fall:

```
System.out.println(Request.Get(uri)
            .connectTimeout(1000)
            .socketTimeout(1000)
            .execute().returnContent().asString());
```


----------



## VfL_Freak (19. Okt 2017)

Moin,
ist dies 


Patrick123 hat gesagt.:


> UnknownHostException


nicht eindeutig genug?? 

Falls nicht, hier mal ein zwei Links zum Thema:
https://docs.oracle.com/javase/8/docs/api/java/rmi/UnknownHostException.html
https://stackoverflow.com/questions...stexception-invalid-hostname-for-server-local

VG Klaus


----------



## Patrick123 (19. Okt 2017)

Wie gesagt, bin leider sehr unerfahren bei dem Thema...
Deshalb sagt mir der Fehler und auch die zwei Links leider nicht all zu viel. Es kann keine Verbindung zu der von mir angegebenen Adresse aufgebaut werden und deshalb kann dort auch nichts abgerufen werden?
Ich weiß nicht, ob das hilft, aber wenn ich die im Code angegebene Adresse im Browser angebe, mich authentifiziere, dann sehe ich die JSON Datei, die ich dann auslesen möchte.


----------



## Thallius (19. Okt 2017)

Frage: Woher weiß Du das die Seite eine Basic-Authentifizierung verlangt?


----------



## Patrick123 (19. Okt 2017)

Thallius hat gesagt.:


> Woher weiß Du das die Seite eine Basic-Authentifizierung verlangt?


Wenn ich die Seite im Browser aufrufe erscheint ein Anmeldefenster. Vom Ersteller weiß ich, dass es eine Basic-Auth ist.


----------



## Thallius (19. Okt 2017)

Ich würde es erstmal mit curl versuchen. Wenn es damit geht kann man einen schritt weiter gehen und es in Java machen.


----------



## Patrick123 (19. Okt 2017)

Mit curl kenne ich mich nicht aus. Ich habe über ein AddOn in Mozilla (HttpRequester) getestet, ob es funktioniert oder nicht. Wenn ich mit Hilfe des Addons die URL aufrufe erhalte ich den Inhalt der Seite - in dem Fall ein .json File.


----------



## Thallius (19. Okt 2017)

Also bei Basic auth. wird doch normalerweise nur in der URL username und password mit übergeben ala

https://username:password@www....

Du gibst aber username und password nirgendwo mit


----------



## mrBrown (19. Okt 2017)

Thallius hat gesagt.:


> Also bei Basic auth. wird doch normalerweise nur in der URL username und password mit übergeben ala


Nö, normalerweise wird das im Header übergeben.
Gab nur diesen Weg ums mit'm Browser leichter zu machen, ist aber veraltet und wird auch von manchen Browsern nicht mehr unterstützt.

Aber Ja, er vergisst den Header mitzugeben.

Sollte aber nicht für das Problem verantwortlich sein, falsche Login-Daten führen nicht zu einer UnknownHostException.
Irgendwas wird vermutlich mit dem Link falsch sein.


----------



## Patrick123 (20. Okt 2017)

Hey,

kannst du vllt ein kurzes Beispiel machen, wie ich den Header mitgeben kann? Wäre super!
Was könnte mit dem Link falsch sein? Ist es ein Unterschied ob ich den einfach im Browser eingebe oder ob ich ihn mittels Java "öffne" ?
Danke im Voraus!

Gruß
Patrick


----------

