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

Services Web Java Discussion :

Requête HTTP avec authentification


Sujet :

Services Web Java

  1. #1
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    septembre 2006
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2006
    Messages : 1 065
    Points : 1 496
    Points
    1 496
    Par défaut Requête HTTP avec authentification
    Bonjour,
    Je suis confronté à un problème d'identification dans un contexte de requête HTTP. Le serveur requiert pour exécuter la requête une authentification, et je ne sais pas du tout comment m'y prendre. Je sais parfaitement créer une requête HTTP standard, l'envoyer et récupérer sa réponse ainsi que l'exploiter, mais je bloque lorsqu'il faut intégrer une authentification à la requête.
    Merci pour votre aide.

    Contexte :
    Windows 8 + Java SE 1.8.0_211-b12

    Précision :
    Je suppose qu'il existe plusieurs méthodes d'identification, mais je ne sais pas les reconnaître, donc incapable de préciser celle qui est utilisée dans mon cas.
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    juin 2018
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : juin 2018
    Messages : 78
    Points : 114
    Points
    114
    Par défaut
    Bonjour,

    J'ai vu avec l'autre discussion fermée, que votre entreprise aviez mis un SSO en place.
    La requête HTTP que vous forgez a pour but d'accéder à un applicatif je suppose ? Le système authentification de l'applicatif cible de la requête fonctionne comment ? Un nom d'utilisateur + mot de passe ? Si oui, vous ne devriez que donner ces informations dans votre requête.

    Egalement, à voir du côté du SSO, avec ce qu'il propose, ceci peut vous aider dans la résolution de votre problème.

    Bon courage

  3. #3
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    septembre 2006
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2006
    Messages : 1 065
    Points : 1 496
    Points
    1 496
    Par défaut
    Bonjour Millezime,
    Merci pour votre réponse. En effet, notre structure met à disposition du navigateur Internet Explorer de nos équipements la technologie du Single Signe On. Ainsi, lorsque l'on ouvre une session Window, le navigateur est lancé automatiquement et sa page d'accueil, la page d'accueil de notre portail Intranet s'affiche sans que nous ayons à nous ré-identifier, I.E. s'appuyant sur notre identité de session pour nous authentifié automatiquement auprès du serveur.
    Cependant, rien ne m'empêche de taper l'URL du dit portail dans Firefox, je tombe alors sur une fenêtre de login qui si je la renseigne avec mon identifiant (nom d'utilisateur + mot de passe) me donne accès au portail de la même manière que I.E. et tant que je ne ferme pas Firefox, cette identification perdure pour disparaître avec la fermeture de Firefox.
    Dans mon cas, j'aimerai que mon programme récupère quelques informations que je sais récupérable via les outils de notre portail auxquels mon identité me donne accès. J'ai pu repérer les requêtes générées par les interfaces d'exploitation et je m'apprêtais à les appliquer depuis mon programme quand je me suis retrouvé confronté à ce souci d'identification que je ne sais pas assumer.
    Donc, premier constat, je ne vais pas chercher à exploiter le Single Signe On. Comme se comporte Firefox, j'en conclus qu'une session http gérée par cookie avec identification à l'établissement de la connexion devrait faire l'affaire. Un peu comme si je voulais accéder à phpmyadmin depuis un programme Java. Moralité, pour m'éviter de dévoiler inconsciemment trop de choses sur le réseau de mon boulot, je me suis attelé à une tâche similaire, à savoir, m'identifier à un serveur sur son url phpmyadmin en vue de récupérer la page d'accueil de ce dernier et d'être en session http avec lui.
    Donc , ma nouvelle problématique est la suivante :
    J'ai un serveur Apache hébergeant phpmyadmin afin d'administrer la base de données MySQL qu'il héberge aussi. Le schéma L.A.M.P. classique.
    Je voudrai depuis un programme Java établir une connexion à phpmyadmin comme le ferait mon navigateur pour pouvoir ensuite soumettre des requêtes phpmyadmin afin de réaliser par exemple le lancement d'une réplication de base.
    Ma première idée a été de regarder comment tout cela se passe depuis un navigateur. J'ai lancé mon Firefox, activé la console, et scruté les requêtes réseau pour pister ce qui se passe lorsque l'on clique sur le bouton OK de la fenêtre de login.
    Une première requête POST est envoyée avec des propriétés en entête de requête. Lorsque l'identifiant est mauvais, le code réponse est 200, et la page de login est renvoyée. Lorsque l'identifiant est bon, c'est le code 302 qui est renvoyé, le navigateur envoie alors une seconde requête de type GET avec en entête un cookie de session précédemment obtenu pour recevoir la page d'accueil de phpmyadmin que l'on retrouve tout de suite après s'être logué.
    A priori, en Java, il me faut établir une connexion HTTP sur l'URL de login du serveur. Prendre soin de placer l'identification dans l'entête de la requête (c'est là que je coinces) et envoyer la requête selon la méthode POST. Si tout se passe bien, je suis sensé retrouver sur mon instance HttpURLConnexion un code réponse valant 302 si l'identification a réussie, sinon 200. Et bien quoi que je fasse, je n'obtient que le code 200. Bref, je n'arrive pas à intégrer correctement l'identifiant dans l'entête de ma requête POST.
    Je n'ai plus le temps maintenant de joindre à ce post mon code, mais dés que ce sera le cas, je complèterai...
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  4. #4
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    septembre 2006
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2006
    Messages : 1 065
    Points : 1 496
    Points
    1 496
    Par défaut
    Ok, je ne vais pas encore montrer de code, c'est inutile. En effet, j'ai compris ce qui coince, et dans un premier temps, ce n'est pas en rapport avec l'identification. Je ne peux malheureusement pas tester mon code chez moi, je ne peux le faire qu'au boulot. C'est pourquoi l'idée de m'exercer sur phpMyAdmin me semblait bonne, mais ce n'est pas le cas. Mon serveur MySQL est hébergé sur un VPS OVH. Ce dernier est associé à mon nom de domaine géré par Ionos. Je profite de ma clientèle chez eux pour bénéficier d'un certificat SSL niveau 1 gratuit (digicert - encryption everywhere) qu'ils gèrent intégralement, il suffit de l'activer. Sauf que voilà ce certificat n'est pas reconnu par l'API JCE de Java, du coup, je ne peux pas établir de connexion en https sur mon serveur OVH à cause de ce certificat non reconnu. Il me faut d'abord trouver moyen d'intégrer la chaîne complète de certification de mon certificat Ionos dans mon keystore avant de pouvoir tenter tout dialogue HTTPs avec mon serveur, et ce n'est pas simple. Comme j'avais pris soin de configurer Apache pour qu'il permette les connexions aussi bien en http qu'en https, je me suis piégé tout seul. En effet, cela me permet d'obtenir la fenêtre de login phpMyAdmin en http, mais phpMyAdmin est configuré pour n'accepter que les connexion https, du coup, même depuis mon navigateur, impossible de me connecté en HTTP, d'où mes nombreuses tentatives inutiles qui m'ont juste fait tourner en rond. Avec le navigateur, je peux me connecter en https et tout fonctionne à merveille et grâce à la console du navigateur, je peux étudier les requêtes envoyées par la page de login de phpMyAdmin. Mais depuis java, je ne peux pas me connecter en https, et phpMyAdmin me l'interdisant en HTTP, je n'ai pas de solution immédiate. Je ne veux pas changer la configuration de mon phpMyAdmin, c'est bien comme ça puisqu'il est accessible depuis Internet. Donc, je vais me créer une petite machine virtuelle locale sous Linux en L.A.M.P. avec phpMyAdmin, le tout en pure http n'acceptant que les connexions locales. Ainsi, j'aurais les bonnes conditions de test chez moi pour étudier les principes de connexions HTTP avec authentification.
    Entre temps, j'ai abandonné l'idée d'utiliser uniquement l'API java.net pour ça. Cette dernière permet de très bien gérer un dialogue simple HTTP sans authentification mais nécessite beaucoup de travail pour l'adapter aux mécanismes d'authentification d'aujourd'hui. J'ai découvert dans mes recherches l'API de Apache nommée HttpClient. Tout indique qu'elle est parfaitement appropriée pour réaliser ce genre de connexion authentifiée. D'après la documentation, tous les mécanismes d'authentification sont supportés, y-compris la simulation d'envoie de données depuis un formulaire. Le temps de mettre tout ça en place, de tester, et je vous promets du code, qu'il fonctionne ou pas.
    Je précise tout cela pour ceux qui sont intéressés par cette discussion afin de montrer qu'elle n'est pas morte.
    Merci à vous, et à +
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  5. #5
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    septembre 2006
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2006
    Messages : 1 065
    Points : 1 496
    Points
    1 496
    Par défaut Problème réglé
    Bonjour,
    J'ai enfin compris comment cela fonctionne, et j'ai réussi à m'identifier et entrer en session avec phpmyadmin depuis mon code Java.
    Cependant, pour y arriver, il m'a fallu récupérer et intégrer mon certificat SSL dans le keystore de ma JVM. Ensuite, j'ai utilisé l'API d'Apache, HttpClient 4.5.8 pour établir le connexion en mode formulaire.
    Voilà le code résultant de mes recherches :

    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
    package TestConnections;
     
    import java.io.IOException;
    import org.apache.http.Header;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpUriRequest;
    import org.apache.http.client.methods.RequestBuilder;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
     
    /**
     *
     * @author thierry
     */
    public class HttpsConWithBasicAuth {
     
        public static void main(String args[]) throws IOException {
            HttpClient client = HttpClients.createDefault();
            RequestBuilder constructeur = RequestBuilder.post("https://xxx.yyy.fr/phpmyadmin/index.php");
            BasicNameValuePair ID = new BasicNameValuePair("pma_username", "utilisateur");
            BasicNameValuePair PWD = new BasicNameValuePair("pma_password", "motdepasse");
            constructeur = constructeur.addParameters(ID, PWD);
            HttpUriRequest httppost = constructeur.build();
            HttpResponse response = client.execute(httppost);
            //Header[] entetes = response.getAllHeaders();
            //for (Header h : entetes) {
            //    System.out.println(h.getName() + " = " + h.getValue());
            //}
            int statusCode = response.getStatusLine().getStatusCode();
            //System.out.println(EntityUtils.toString(response.getEntity()));
            if (response.getStatusLine().getReasonPhrase().equalsIgnoreCase("found")) {
                // Identification réussie, il suffit de lancer un Thread en lui confiant le cookiestore et la connexion.
                // Ce dernier pourra alors réaliser toutes les requêtes get qu'il veut en session identifiée.
                // Le simple fait de terminer le Thread terminera la session proprement en envoyant au serveur l'url de logout.
                System.out.println("Identification réussie...");
            }
            else System.out.println("Echec de l'identification.");
        }
     
    }
    Comme vous pouvez le constater, l'ensemble des classes utilisées dans ce code est issu de l'API Apache HttpClient 4.5.8. Cette API est très bien documentée et il existe de nombreux exemples fiables qui m'ont permis d'élaborer cette petite solution.
    Pour pouvoir fournir les éléments requis au serveur que sont les variables d'identification "pma_username" et "pma_password" et interpréter le mot clé "found" donné en réponse comme signe d'identification réussie, j'ai procédé à une analyse de connexion depuis le navigateur Firefox via sa console de maintenance. Comme le montre la figure ci-dessous, une simple identification m'a permis de relever ces informations :

    Pour le relevé du code et de la phrase réponse (surligné de jaune) :


    Pour le relevé des noms de variables d'identification (surlignés de jaune) :



    Voilà, il ne me reste plus qu'à gérer la session de dialogue dans un thread. Fort de cette expérience, je vais maintenant pouvoir tenter de réaliser la même chose au boulot. Sauf que là, c'est pas pour se connecter à phpmyadmin et de toute évidence, il me faudra aborder l'identification type NTLM. Quoi qu'il en soit, j'ai été ravis de partager cette petite expérience avec vous.
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème Requête HTTP avec authentification
    Par mathieulai dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 10/03/2017, 15h36
  2. Script de requêtes HTTP avec paramètre en boucle
    Par padsalad dans le forum Langage
    Réponses: 3
    Dernier message: 30/06/2009, 16h46
  3. Requête http avec retour XML
    Par safisafi dans le forum ASP.NET
    Réponses: 2
    Dernier message: 19/05/2009, 15h55
  4. Problème requête HTTP avec caméra IP
    Par Sleeping Lionheart dans le forum Bibliothèques
    Réponses: 7
    Dernier message: 28/02/2009, 21h25
  5. Faire une requête https avec une application Delphi 7
    Par davidkungfu dans le forum Web & réseau
    Réponses: 12
    Dernier message: 10/04/2008, 10h39

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