IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Authentification NTLM sous Android


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 10
    Par défaut Authentification NTLM sous Android
    Bonjour,

    Je tente de m'authentifier sur un site et le code ci-dessous fonctionne parfaitement sur une application console lambda mais si je tente de le faire fonctionner sous android (1.6 ou 2.1), je reçoit ce message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Caused by: java.lang.StringIndexOutOfBoundsException
    at java.lang.String.substring(String.java:1646)
    at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.getAuthorizationCredentials(HttpURLConnection.java:1671)
    at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.doRequestInternal(HttpURLConnection.java:1603)
    at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.doRequest(HttpURLConnection.java:1551)
    at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1052)
    at com.example.testa.MainActivity.onCreate(MainActivity.java:45)
    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.Authenticator;
    import java.net.HttpURLConnection;
    import java.net.PasswordAuthentication;
    import java.net.URL;
     
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    import android.widget.Toast;
     
    public class MainActivity extends Activity {
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		String html = null;
    		try{
    			final String urlStr = "cible";
    			final String domain = ""; 
    			final String userName = "username";
    			final String password = "password";		
     
    			StringBuilder response = new StringBuilder();
     
    			Authenticator.setDefault(new Authenticator() {
    		        @Override
    		        public PasswordAuthentication getPasswordAuthentication() {
    		            return new PasswordAuthentication(domain + "\\" + userName, password.toCharArray());
    		        }
    		    });
     
    		    URL urlRequest = new URL(urlStr);
    		    HttpURLConnection conn = (HttpURLConnection) urlRequest.openConnection();
    		    conn.setDoOutput(true);
    		    conn.setDoInput(true);
    		    conn.setRequestMethod("GET");
     
    		    InputStream stream = conn.getInputStream();
    		    BufferedReader in = new BufferedReader(new InputStreamReader(stream));
    		    String str = null;
    		    while ((str = in.readLine()) != null) {
    		        response.append(str);
    		    }
    		    in.close();		
     
    		    html = response.toString();
     
    		}
    		catch(IOException e){
     
    		}
    		Toast.makeText(getApplicationContext(), html, Toast.LENGTH_LONG).show();
     
    	}
     
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.activity_main, menu);
    		return true;
    	}
     
    }
    Je ne comprends pas d'où peut venir ce problème.

  2. #2
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,


    Pas de connexion réseaux dans le Thread UI, ceci est interdit, il faut passer par un Thread (AsyncTask, Thread, ...).

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 10
    Par défaut
    Je ne pense pas que les connexions dans le Thread UI soient interdits dans 1.6, néanmoins, j'ai exactement le même message d'erreur en utilisant une AsyncTask.

  4. #4
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Yep c'est juste un peu plus mais de toute manière ca va te poser problème.

    Sinon vu l'erreur :
    Caused by: java.lang.StringIndexOutOfBoundsException
    at org.apache.harmony.luni.internal.net.http://www.protocol.http.HttpURLConn...tion.java:1052)
    lors de ta requête getInputStream tu as une erreur sur ta string urlStr: qui est "cible"

    Si tu ne nous montres pas réellement la page http ou au moins son format ca va être dur de t'aider.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 10
    Par défaut
    Bon alors en fait c'est vraiment tout bête, mais j'avais une URL de type http://subdomain.domain.fr/default.aspx sans les WWW, bref sous android cela pose problème.
    Maintenant, je n'ai plus d'erreur mais une exception au niveau du conn.getInputStream() qui est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Host is unresolved: www.sub.domain.fr:80
    Alors quelles sont les différences avec android ? Un proxy interne ou quelque chose dans le même genre ?

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Je ne pense pas que les connexions dans le Thread UI soient interdits dans 1.6.
    Ils le sont depuis toujours... Même dans les applications "desktop".. on ne fait pas de truc potentiellement "lents" (et un accès réseau l'est toujours) dans le même thread que celui ou on gère les interactions avec l'utilisateur.

    Par contre, le système Android ne vérifie pas que la programmation est correcte avant la version 3.0

    Un peu comme il était DEJA interdit de stocker des données utilisateurs à coté du programme sous Windows 95... Et il a fallu attendre Windows NT6 pour que cela soit empêché par le système.


    Bon sinon.. on dirait qu'il colle le :80 (le port) dans le host (ce qui n'est pas bon)... on pourrait voir les données de l'URL exacte (et comment celle-ci est construite avant le openConnection() ?)

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 10
    Par défaut
    Mon url est de la forme http://sub.site.fr
    Celle-ci marche très bien sans android mais renvoie l'erreur du début sous android, j'ai donc ajouter www pour avoir http://www.sub.site.fr et une autre erreur apparait.
    Je suis allé sur ce site http://www.analyses-url.com/cgi-bin/meta/analyse.pl et la forme en www me renvoie ce message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur 500 Can't connect to www.sub.site.fr:80 (Bad hostname 'www.sub.site.fr')
    alors que http://sub.site.fr me renvoi une erreur 401 ce qui me semble beaucoup plus logique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur 401 Unauthorized
    Le problème vient donc du www et j'en reviens au début du post avec le java.lang.StringIndexOutOfBoundsException

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Tu veux pas la lâcher ta vraie URL hein !

    Sinon... google me dit qu'il y avait un vieux bug sur un 401 quand le "challenge" ne contient rien d'autre que le 'scheme' (ce qui de toute manière ne devrait pas être autorisé, cf: RFC-2617, puisque de la forme: challenge = auth-scheme 1*SP 1#auth-param)
    https://code.google.com/p/android/is...etail?id=12670

    Mais bon... depuis 3 ans cela aurait du être corrigé...
    Tu compiles avec quel SDK ?

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 10
    Par défaut
    J'utilise android 1.6 mais la seule différence avec une version console c'est le compiler compliance level dans Java compiler qui est a 1.7 et 1.6 pour android même si ça ne change rien.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 10
    Par défaut
    Je viens d'essayer avec ce code qui ne soulève pas d'exception sous android mais qui ne marche pas non plus alors que je peux m'authentifier avec sous console :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    try {
                	DefaultHttpClient httpclient = new DefaultHttpClient();
     
                	NTCredentials creds = new NTCredentials("user", "pass", "myworkstation", "site.fr");
                	httpclient.getCredentialsProvider().setCredentials(AuthScope.ANY, creds);
     
                	HttpHost target = new HttpHost("sub.site.fr", 80, "http");
     
                	// Make sure the same context is used to execute logically related requests
                	HttpContext localContext = new BasicHttpContext();
     
                	HttpGet httpget = new HttpGet("http://sub.site.fr/");
                	HttpResponse response = httpclient.execute(target, httpget, localContext);
                	HttpEntity entity = response.getEntity();
                	System.out.println(EntityUtils.toString(entity));
     
            } catch (UnsupportedEncodingException e) {
        	} catch (ClientProtocolException e) {
        	} catch (IOException e) {
        	}
    L'erreur renvoyer est celle-ci http://support.microsoft.com/kb/253667/fr

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 10
    Par défaut
    Après avoir essayé une troisième méthode qui marche sous console mais pas sous android, quelqu'un aurait-il une idée des mécanismes d'android empêchant ces méthodes de fonctionner ? Car le problème est bien spécifique à android ici ...

  12. #12
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Ph0nyx Voir le message
    J'utilise android 1.6 mais la seule différence avec une version console c'est le compiler compliance level dans Java compiler qui est a 1.7 et 1.6 pour android même si ça ne change rien.
    Heu tu confonds là.... Je parlais de la version d'Android, pas la version de Java...
    Si tu parles d'Android "Donut" (1.6) alors effectivement, abandonne vite cette version (passe au moins à Android 2.1)

    Le java-compiler oui... la JVM non.... Android ne tourne pas sur Sun Java (n'en déplaisent à nos amis de chez Oracle), mais sur Dalvik qui n'a pas grand chose à voir... et (à part une vingtaine de lignes sur un test d'index comme confirmé par un récent procès) les librairies "java" sont entièrement sur Android.

    Perso, cette classe n'existe pas chez moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection
    Et la seule version que j'ai trouvé sur le net, comporte le bug que j'évoquais... donc....

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 10
    Par défaut
    J'ai essayé sous Eclair mais c'est exactement le même problème (je tourne sous Donut donc bon ), par contre je ne comprends pas pourquoi cette classe n'existe pas chez toi mais j'importe seulement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import java.net.HttpURLConnection;
    Sinon reste à trouver une solution à mon problème d'authentification NTLM... Je vois vraiment pas comment faire

Discussions similaires

  1. Authentification NTLM et variable POST
    Par JmL40 dans le forum Langage
    Réponses: 1
    Dernier message: 12/03/2008, 17h02
  2. Authentification ntlm et zone Intranet
    Par jeff_! dans le forum IIS
    Réponses: 0
    Dernier message: 07/11/2007, 15h03
  3. Réponses: 2
    Dernier message: 18/10/2007, 16h44
  4. Proxy squid avec authentification NTLM
    Par chrisbadj dans le forum Réseau
    Réponses: 3
    Dernier message: 08/08/2007, 16h32
  5. Authentification NTLM avec ASP 3.0
    Par Poussy-Puce dans le forum IIS
    Réponses: 1
    Dernier message: 26/02/2007, 22h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo