Connexion Java au Registre de métadonnées Aristote


J'essaie d'écrire une application Java pour interroger des données dans une instance de registre de métadonnées Aristote. Je prévois finalement d'interroger les points d'entrée qui fournissent une sortie JSON sur laquelle mon application peut fonctionner. Pour commencer, je dois me connecter à Aristote. Quand je regarde la console Aristote pour un utilisateur Web régulier qui se connecte, je vois cette séquence:

[15/Aug/2018 21:16:59] "GET /login?next=/account/home HTTP/1.1" 200 7098
[15/Aug/2018 21:16:59] "GET /static/COMPILED/aristotle_mdr/login.css HTTP/1.1" 200 784
[15/Aug/2018 21:17:08] "POST /login HTTP/1.1" 302 0
[15/Aug/2018 21:17:08] "GET /account/home HTTP/1.1" 200 16379
[15/Aug/2018 21:17:08] "GET /static/aristotle_mdr/bootstrap/css/bootstrap.min.css HTTP/1.1" 200 122241
[15/Aug/2018 21:17:08] "GET /static/aristotle_mdr/bootstrap/js/bootstrap.min.js HTTP/1.1" 200 37340
[15/Aug/2018 21:17:08] "GET /static/COMPILED/aristotle_mdr/aristotle.visuals.css HTTP/1.1" 200 1320
[15/Aug/2018 21:17:08] "GET /static/COMPILED/aristotle_mdr/aristotle.css HTTP/1.1" 200 6957
[15/Aug/2018 21:17:08] "GET /static/aristotle_mdr/bootstrap.wcag.css HTTP/1.1" 200 656
[15/Aug/2018 21:17:08] "GET /static/aristotle_mdr/pink.wcag.css HTTP/1.1" 200 1231
[15/Aug/2018 21:17:08] "GET /static/aristotle_mdr/aristotle.js HTTP/1.1" 200 1647
[15/Aug/2018 21:17:08] "GET /static/bootstrap3_datetime/bootstrap-datetimepicker.min.css HTTP/1.1" 200 7785
[15/Aug/2018 21:17:08] "GET /static/bootstrap3_datetime/moment.min.js HTTP/1.1" 200 61317
[15/Aug/2018 21:17:08] "GET /static/bootstrap3_datetime/bootstrap-datetimepicker.min.js HTTP/1.1" 200 38514
[15/Aug/2018 21:17:08] "GET /static/aristotle_mdr/aristotle.notify.js HTTP/1.1" 200 3848
[15/Aug/2018 21:17:08] "GET /static/COMPILED/aristotle_mdr/aristotle.dashboard.css HTTP/1.1" 200 2506

Je n'essaie pas de reproduire le chargement .js et .css, mais en essayant de copier les autres GETs et POSTs. Mon programme de test produit ces résultats:

[15/Aug/2018 21:22:53] "GET /login HTTP/1.1" 200 7085
[15/Aug/2018 21:22:53] "POST /login HTTP/1.1" 302 0
[15/Aug/2018 21:22:53] "GET /account/home HTTP/1.1" 302 0
[15/Aug/2018 21:22:53] "GET /login?next=/account/home HTTP/1.1" 200 7098

Non seulement quelque chose de différent ici, mais le HTML retourné n'est pas "compte/accueil" pour mon utilisateur de test mais est une nouvelle page de connexion.

À partir de research online, j'enregistre et utilise les cookies de mes appels de serveur, en particulier "csrftoken" et "csrfmiddlewaretoken". Ces valeurs changent parfois de la demande à la réponse. Je soupçonne que je ne les gère peut-être pas correctement. Je m'interroge également sur d'autres cookies que je vois lorsque je suis la connexion Web, tels que "sessionid", "JSESSIONID", "remember-me"et" XSRF-TOKEN". J'ai également débogué le serveur Aristote. Je peux suivre la demande.utilisateur du Web, mais mon programme de test s'affiche comme "Utilisateur anonyme". Je dois manquer quelque chose pour retenir l'utilisateur.

Le programme de test n'est certainement pas approprié pour la connexion et la sécurité réelles. En ce moment, j'essaie juste de passer la connexion afin de pouvoir explorer comment demander des données. J'apprécierais toutes les idées. Programme de test suit.

package tester;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.CookieManager;
import java.net.HttpCookie;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;

public class AristotleConnect {

    private CookieManager msCookieManager = new CookieManager();
    private String fullCookieString;


    public static void main(String[] args) {
        AristotleConnect ac = new AristotleConnect();
        ac.connect();
    }

    private void connect() {
        String urlStr = "http://localhost:8000/";
        String loginUrlStr = urlStr + "login";
        HttpURLConnection connection = null;

        // Initial connection
        try {
            connection = (HttpURLConnection) new URL(loginUrlStr).openConnection();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // Save cookies
        saveCookies(connection);

        // Try login
        String user = "SOME-REAL-USER";
        String pw = "THE-PASSWORD";
        String params = "username=" + user + "&password=" + pw;

        try {
            sendPost(loginUrlStr, params);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

//      // Does resaving cookies now give us what we need for login?
//      saveCookies(connection);
//      try {
//          sendPost(loginUrlStr, params);
//      } catch (Exception e) {
//          // TODO Auto-generated catch block
//          e.printStackTrace();
//      }


    }

    private void saveCookies(HttpURLConnection connection) {
        final String COOKIES_HEADER = "Set-Cookie";

        Map<String, List<String>> headerFields = connection.getHeaderFields();
        List<String> cookiesHeader = headerFields.get(COOKIES_HEADER);
        fullCookieString = cookiesHeader.get(0);

        if (cookiesHeader != null) {
            for (String cookie : cookiesHeader) {
                msCookieManager.getCookieStore().add(null,HttpCookie.parse(cookie).get(0));
            }               
        }
    }

    private String addCookie(HttpURLConnection con, String urlParameters) {
        String newUrlParameters = urlParameters;
        if (msCookieManager.getCookieStore().getCookies().size() > 0) {

            con.setRequestProperty("Cookie", fullCookieString );

            String csrfValue = "";
            for ( HttpCookie ck : msCookieManager.getCookieStore().getCookies()) {
                if ( "csrftoken".equals(ck.getName())) {
                    csrfValue = ck.getValue();
                }
            }
            newUrlParameters = "csrfmiddlewaretoken=" + csrfValue + "&" + newUrlParameters ;
            con.setRequestProperty("csrfmiddlewaretoken", csrfValue);

        }
        return newUrlParameters;
    }

    // HTTP POST request
    private HttpURLConnection sendPost(String url, String urlParameters) throws Exception {

        URL obj = new URL(url);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();

        //add request header
        con.setRequestMethod("POST");
        con.setRequestProperty("User-Agent", "Mozilla/5.0");
        con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
        con.setRequestProperty("Accept", "*/*");

        urlParameters = addCookie(con, urlParameters);

        // Send post request
        con.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(con.getOutputStream());
        wr.writeBytes(urlParameters);
        wr.flush();
        wr.close();

        // Show results
        int responseCode = con.getResponseCode();
        System.out.println("\nSending 'POST' request to URL : " + con.getURL());
        System.out.println("Post parameters : " + urlParameters);
        System.out.println("Response Code : " + responseCode);

        BufferedReader in = new BufferedReader(
                new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();

        //print result
        System.out.println(response.toString());

        return con;
    }
}
Author: rknowles, 2018-08-16