Wie mache ich die HTTP-Authentifizierung in Android?


73

Ich überprüfe die Klasse org.apache.http.auth. Noch mehr Referenz oder Beispiel, wenn jemand hat?


2
Handelt es sich um eine Frage zur Authentifizierung von Android-Anwendungen oder nur zur Authentifizierung für eine allgemeine Webanwendung, die möglicherweise unter Android ausgeführt wird?
Jottos

Für die Webauthentifizierung (http-Authentifizierung) für Benutzeranmeldeinformationen (Benutzername, Kennwort)
Bohemian

Antworten:


79

Ich habe dieses spezielle Paket noch nicht kennengelernt, aber es heißt, es ist für die clientseitige HTTP-Authentifizierung gedacht, die ich unter Android mithilfe der java.netAPIs durchführen konnte, wie folgt:

Authenticator.setDefault(new Authenticator(){
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication("myuser","mypass".toCharArray());
    }});
HttpURLConnection c = (HttpURLConnection) new URL(url).openConnection();
c.setUseCaches(false);
c.connect();

Offensichtlich sollte Ihre getPasswordAuthentication () wahrscheinlich etwas Intelligenteres tun, als eine Konstante zurückzugeben.

Wenn Sie versuchen, eine Anfrage mit einem Körper (z. B. POST) mit Authentifizierung zu stellen, achten Sie auf das Android-Problem 4326 . Ich habe dort einen Lösungsvorschlag mit der Plattform verknüpft, aber es gibt eine einfache Problemumgehung, wenn Sie nur die Standardauthentifizierung wünschen: Machen Sie sich keine Gedanken über Authenticator und tun Sie stattdessen Folgendes:

c.setRequestProperty("Authorization", "basic " +
        Base64.encode("myuser:mypass".getBytes(), Base64.NO_WRAP));

Kennen Sie eine Base64-Codierungsklasse in Android 2.0?
Böhmischer

Die Plattform hat es an einigen Stellen, aber seltsamerweise legen sie es nicht frei. Sie haben sogar Verweise darauf in den Dokumenten von z android.util. Ich habe es verwendet, ksoap2-androidals ich es gefunden habe, und sie haben eine Implementierung, die nur davon abhängt java.io, sodass Sie diese Klasse (natürlich vorbehaltlich ihrer Lizenz) einfach
Chris Boyle

3
Wie gehen Sie mit dem Ereignis um, dass die Authentifizierung fehlschlägt, beispielsweise weil die angegebenen Anmeldeinformationen fehlerhaft sind?
SK9

1
Base64 ist in älteren Android-Versionen nicht verfügbar. Irgendwelche Vorschläge dort?
Am

Ich erhalte eine Fehlermeldung, wenn ich versuche, c.connect (); , es heißt IOException
Bachask8

116

Für mich hat es funktioniert,

final String basicAuth = "Basic " + Base64.encodeToString("user:password".getBytes(), Base64.NO_WRAP);

Apache HttpCLient:

request.setHeader("Authorization", basicAuth);

HttpUrlConnection:

connection.setRequestProperty ("Authorization", basicAuth);

23
Das NO_WRAP-Flag! Das war der Schlüssel. Ich habe nur die Standardeinstellung verwendet und mich gefragt, warum ich immer wieder eine 400 bekommen habe.
Robert Massaioli

5
Ihre Antwort spart mir viel Zeit. Danke! Mein Problem war wirklich in der falschen Flagge (STANDARD).
Johnny Doe

5
Endlich, nach langer Zeit ... no_wrap FTW!
Thiago Festa

Danke Kumpel, das ist der Kern :)
John Christy

1
Danke für die nette prägnante Antwort! Android Community FTW.
LukeWaggoner

14

Sie können den http-Header manuell einfügen, um Folgendes anzufordern:

HttpGet request = new HttpGet(...);
request.setHeader("Authorization", "Basic "+Base64.encodeBytes("login:password".getBytes()));

13

Die manuelle Methode funktioniert gut mit dem Import von android.util.Base64, aber stellen Sie sicher, dass Base64.NO_WRAP beim Aufrufen von encode festgelegt wird:

String basicAuth = "Basic " + new String(Base64.encode("user:pass".getBytes(),Base64.NO_WRAP ));
connection.setRequestProperty ("Authorization", basicAuth);


1

Das funktioniert bei mir

 URL imageUrl = new URL(url);
                    HttpURLConnection conn = (HttpURLConnection) imageUrl
                            .openConnection();
                    conn.setRequestProperty("Authorization", "basic " +
                            Base64.encode("username:password".getBytes()));
                    conn.setConnectTimeout(30000);
                    conn.setReadTimeout(30000);
                    conn.setInstanceFollowRedirects(true);
                    InputStream is = conn.getInputStream();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.