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 :

Application Android, Proxy et authentification


Sujet :

Android

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Application Android, Proxy et authentification
    Bonjour

    Dans le cadre du développement d'une application Android pour mon entreprise, je dois pouvoir communiquer avec un serveur à travers un proxy avec une authentification.

    Voici le code que j'ai écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    final HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_NAME, PROXY_PORT)));
     
    Authenticator.setDefault(new NtlmAuthenticator(PROXY_USERNAME, PROXY_PASSWORD));
     
    connection.setConnectTimeout(5000);
    connection.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
    connection.setDoInput(true);
    connection.setDoOutput(true);
     
    final int retCode = connection.getResponseCode();
     
    System.out.println("Return code : " + retCode);
    avec la classe

    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
     
    private class NtlmAuthenticator extends Authenticator {
    	private final String username;
    	private final String password;
     
    	public NtlmAuthenticator(final String username, final String password) {
    		super();
    		this.username = username;
    		this.password = password;
    	}
     
    	@Override
    	public PasswordAuthentication getPasswordAuthentication() {
    		System.out.println("Get password auth");
    		return (new PasswordAuthentication(username, password.toCharArray()));
    	}
    }
    Malheureusement, j'obtiens toujours un response code égal à 407 et je me suis rendu compte que je ne passais jamais dans le méthode getPasswordAuthentication

    Ce même programme fonctionne très bien avec un programme Java non Android.

    Ma version d'Android est la 4.4.4 et j'ai vu qu'elle utilisait OkHttp pour les requêtes. En debuggant et en entrant dans le code d'Android, je me suis rendu compte que l'objet OkHttp contenait bien ma configuration de proxy mais pas mon authenticator.

    Je ne vois pas trop comment faire.

    Pourriez-vous m'aider

    Merci d'avance

    Cordialement

  2. #2
    Membre éclairé Avatar de alves1993
    Homme Profil pro
    Développeur Java/Dart/Javascript/Android (FullStack)
    Inscrit en
    Décembre 2012
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Java/Dart/Javascript/Android (FullStack)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 222
    Points : 659
    Points
    659
    Par défaut
    J'arrive pas à cerner ces deux bout de codes.
    la Classe fait quoi au juste ?
    Mais essaie sa voire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DefaultHttpClient httpclient = new DefaultHttpClient();
    HttpHost httpproxy = new HttpHost("<your proxy host>",<your proxy port>);
    httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, httpproxy);
    Un geek ne vieillit pas, il se met à jour.

    Pour plus d'informations sur Android regarder la faq Android.
    Ensuite les tutoriels Android sont disponibles ici
    Pour les mecs, qui n'arrivent pas toujours à digérer le Javascript, Dart peut-être une solution pour vous.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Bonjour

    En fait, la classe NtlmAuthenticator est censé me permettre de réaliser l'authentification auprès du proxy.

    Or ce code fonctionne très bien dans un programme Java mais pas sous Android.

    Dans le code que vous me proposez, il n'y a nulle part la notion d'authentification. Mon problème se situe bien sur cette authentification et non sur le fait de passer par le proxy.

    J'ai essayé avec une autre méthode basé sur OkHTTP mais toujours avec les même résultat.

    Voici le code avec OkHttp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    final OkHttpClient client = new OkHttpClient.Builder().connectTimeout(60, TimeUnit.SECONDS).writeTimeout(60, TimeUnit.SECONDS)
                            .readTimeout(60, TimeUnit.SECONDS).proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy_serveur", proxy_port)))
                            .addInterceptor(new NtlmAuthenticator("username", "password")).build();
     
    final RequestBody body = RequestBody.create(MediaType.parse("text/xml; charset=utf-8"), sb.toString());
    final Request httpRequest = new Request.Builder().url(url).post(body).build();
     
    final Call postCall = client.newCall(httpRequest);
    final Response httpResponse = postCall.execute(); // you have your response code
    final int httpStatusCode = httpResponse.code();
    Avec la classe

    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
    private class NtlmAuthenticator implements Authenticator, Interceptor {
     
            private final String username;
     
            private final String password;
     
            public NtlmAuthenticator(final String username, final String password) {
                super();
                this.username = username;
                this.password = password;
            }
     
            public PasswordAuthentication getPasswordAuthentication() {
                System.out.println("Get password auth");
                return (new PasswordAuthentication(username, password.toCharArray()));
            }
     
            @Override
            public Request authenticate(final Route route, final Response response) throws IOException {
                System.out.println("Get password auth");
                if (responseCount(response) >= 3) {
                    return null; // If we've failed 3 times, give up. - in real life, never give up!!
                }
                final String credential = Credentials.basic(username, password);
                return response.request().newBuilder().header("Authorization", credential).header("Proxy-Authorization", credential).build();
            }
     
            private int responseCount(Response response) {
                int result = 1;
                while ((response = response.priorResponse()) != null) {
                    result++;
                }
                return result;
            }
     
            @Override
            public Response intercept(final Chain chain) throws IOException {
                System.out.println("Get password auth from interceptor");
                final String credential = Credentials.basic(username, password);
                final Request request = chain.request();
                final Request authenticatedRequest = request.newBuilder().header("Authorization", credential).build();
                return chain.proceed(authenticatedRequest);
            }
        }
    Mais j'ai toujours une erreur 407

    Merci d'avance pour votre aide

    Cordialement

Discussions similaires

  1. Intégration de Google Maps dans votre application Android
    Par michel.di dans le forum API standards et tierces
    Réponses: 22
    Dernier message: 07/10/2011, 20h02
  2. Réponses: 0
    Dernier message: 19/07/2008, 09h52
  3. Protéger l'application avec fenetre d'authentification
    Par abbd dans le forum Windows Forms
    Réponses: 2
    Dernier message: 18/05/2008, 18h34

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