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?

Bohemien
quelle
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));
Chris Boyle
quelle
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);
cesards
quelle
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()));
Dmitry Sitnikov
quelle
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);
GWu
quelle
3

Für meine Android-Projekte habe ich die Base64-Bibliothek von hier aus verwendet:

http://iharder.net/base64

Es ist eine sehr umfangreiche Bibliothek und bisher hatte ich keine Probleme damit.

Oke Uwechue
quelle
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();
Cristiana Chavez
quelle