Accesso Java al Registro dei metadati Aristotele


Sto cercando di scrivere un'app Java per interrogare i dati in un'istanza del Registro dei metadati di Aristotele. Alla fine ho intenzione di interrogare i punti di ingresso che forniscono l'output JSON per la mia app su cui lavorare. Per iniziare devo accedere ad Aristotele. Quando guardo la console Aristotele per un normale utente web che accede, vedo questa sequenza:

[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

Non sto cercando di riprodurre il caricamento .js e .css, ma cercando di copiare gli altri GET e POST. Il mio programma di test produce questi risultati:

[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 solo c'è qualcosa di diverso qui, ma l'HTML restituito non è "account/home" per il mio utente di test ma è una nuova pagina di accesso.

Da research online sto salvando e utilizzando i cookie dalle mie chiamate al server, in particolare "csrftoken" e "csrfmiddlewaretoken". Questi valori a volte cambiano da richiesta a risposta. Sospetto che potrei non gestirli correttamente. Mi chiedo anche altri cookie che vedo quando seguo il login web, come " sessionid", "JSESSIONID","remember-me" e "XSRF-TOKEN". Ho anche eseguito il debug del server Aristotele. Posso seguire la richiesta.utente dal web, ma il mio programma di test mostra come "Anonimo-Utente". Devo mancare qualcosa per mantenere l'utente.

Il programma di test non è sicuramente adatto per il login e la sicurezza reali. In questo momento sto solo cercando di superare il login in modo da poter esplorare come richiedere i dati. Gradirei qualsiasi idea. Segue il programma di test.

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