2009-12-28 6 views
70

Ich checke die Klasse org.apache.http.auth aus. Noch mehr Referenz oder Beispiel, wenn jemand hat?Wie HTTP-Authentifizierung in Android zu tun?

+2

Ist das eine Frage über Android Anwendungen Authentifizierung oder nur zur Authentifizierung für einen allgemeinen Web-App, die nur auf Android laufen könnte? – jottos

+0

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

Antwort

77

Ich habe nicht vor, dass bestimmtes Paket erfüllt, aber es sagt, dass es für die clientseitige HTTP-Authentifizierung, die ich habe auf Android mit den java.net APIs, wie dies zu tun in der Lage:

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, hüten Sie sich vor Android issue 4326. Ich habe eine vorgeschlagene Lösung, um die Plattform dort verbunden sind, aber es gibt eine einfache Abhilfe, wenn Sie nur Grund Auth wollen: nicht mit Authenticator stören, und statt dies tun:

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

Kennen Sie eine Base64-Codierungsklasse, die in Android 2.0 vorhanden ist? – Bohemian

+0

Die Plattform hat es an einigen Stellen, aber seltsamerweise stellen sie es nicht aus. Sie haben sogar Referenzen in den Dokumenten von z.B. 'android.util'. Ich habe 'ksoap2-android' verwendet, als ich das gefunden habe, und sie haben eine Implementierung, die nur von' java.io' abhängt, also könnt ihr diese Klasse (vorbehaltlich ihrer Lizenz natürlich) von http: // kobjects holen .cvs.sourceforge.net/kobjects/kobjects/src/org/kobjects/base64/Base64.java? view = markup –

+3

Wie behandeln Sie das Ereignis, dass die Authentifizierung fehlschlägt, sagen Sie, weil die angegebenen Anmeldeinformationen falsch sind? – SK9

3

Für meine Android-Projekte Ich habe die Base64-Bibliothek verwendet, um von hier:

http://iharder.net/base64

es ist eine sehr umfangreiche Bibliothek und bisher habe ich keine Probleme mit ihm hat.

14

Sie manuell http-Header einfügen können beantragen:

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

Manuelle Methode funktioniert gut mit Import android.util.Base64, aber sicher sein Base64.NO_WRAP setzen auf kodieren Aufruf:

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

Für mich es funktionierte,

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 benutzte nur den Standard und fragte mich, warum ich immer 400 bekam. –

+5

Ihre Antwort spart mir eine Menge Zeit. Danke! Mein Problem war wirklich in der falschen Flagge (DEFAULT). –

+5

Endlich, nach langer Zeit ... no_wrap FTW! –

1

Dies funktioniert für mich

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();