Publier sur Siteminder connexion.fcc pour récupérer un cookie en utilisant java


Mon application doit accéder à certaines URL protégées par SiteMinder et a donc besoin du cookie SMSession fourni par l'agent Siteminder.

Je souhaite acquérir un cookie SMSession en postant mes identifiants de connexion dans le formulaire de connexion Siteminder.

J'ai essayé de nombreuses façons différentes d'accéder et de publier les données nécessaires (target, smauthreason, smagentname, nom d'utilisateur, mot de passe) à la connexion.la fcc. Je peux le poster comme ceci dans Postman / Fiddler et récupérer un cookie.

try {
        URL requestURL = new URL("HTTPS_URL_TO_THE/login-captcha.fcc");
        HttpsURLConnection conn = (HttpsURLConnection) requestURL.openConnection();
        conn.setDoOutput(true);
        //conn.setDoInput(true);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Host", "HOST_FROM_ABOVE");
        conn.setRequestProperty("Connection", "keep-alive");
        conn.setRequestProperty("Content-Length","" + createBody().getBytes().length);
        conn.setRequestProperty("Cache-Control", "max-age=0");
        conn.setRequestProperty("Origin", "ORIGIN_HOST_FROM_WHERE_POSTED");
        conn.setRequestProperty("Upgrade-Insecure-Requests", "1");
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36");
        conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
        conn.setRequestProperty("DNT", "1");
        conn.setRequestProperty("Referer", "REFERER_TAKEN_FROM_FIDDLER");
        conn.setRequestProperty("Accept-Encoding", "gzip, deflate, br");
        conn.setRequestProperty("Accept-Language", "de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7");


        OutputStream os = conn.getOutputStream();
        os.write(createBody().getBytes());

        BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));               
        String in;
        while ((in = br.readLine()) != null){
            System.out.println(in);
        }

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

Je vais obtenez une connexion et pouvez accéder à la page lorsque je fournis le cookie auparavant. Mais dans cette étape, je veux récupérer le cookie.

Les données corporelles sont correctes à 100%. Les en-têtes utilisés dans l'exemple ci-dessus ne sont pas toutes nécessaires. Et ce fut mon dernier essai désespéré affichant exactement la même chose que celle montrée dans fiddler. Mais je n'obtiendrai pas de connexion ou de redirection HTTP 302.

Pourquoi ça ne marche pas? Toutes les suggestions?

Author: cmprinho, 2018-04-20

1 answers

J'ai eu la solution pour mon problème. En fait, je devrai gérer la redirection manuellement. Si je suis la redirection automatiquement, le cookie récupéré ne sera pas envoyé avec la prochaine demande. Publier sur targetURL sans le cookie redirige automatiquement vers la page de connexion.

URL protectedURL = new URL(protectedURLString);
        HttpsURLConnection conn = (HttpsURLConnection) protectedURL.openConnection();
        conn.setInstanceFollowRedirects(false);

        boolean redirect = false;
        System.out.println("Request URL: " + protectedURL);

        //Check for redirection
        int status = conn.getResponseCode();
        if(status != HttpURLConnection.HTTP_OK) {
            if(status == HttpURLConnection.HTTP_MOVED_TEMP 
                    || status == HttpURLConnection.HTTP_MOVED_PERM
                    || status == HttpURLConnection.HTTP_SEE_OTHER) {
                redirect = true;
            }
        }
        System.out.println("Response Code: " + status);

        //If redirected
        if(redirect) {
            //get new redirect URL from Location header field
            String newURL = conn.getHeaderField("Location");
            URL tempURL = new URL(newURL);
            String query = tempURL.getQuery();
            //Read parameters from query
            String [] params = query.split("&");
            for (String param : params) {
                String [] parts = param.split("=");
                String key = parts[0].toLowerCase();
                String value = "";
                if(parts.length > 1)
                    value = parts[1];
                updateVars(key, value);
            }

        }
        postToLogin(this.URL_LOGIN);

C'est du code utilisé dans ma solution. updateVars(key, value) met à jour les variables de classe. postToLogin(this.URL_LOGIN) messages à l'URL de connexion contenant un corps généré à l'aide des variables de classe.

 1
Author: cmprinho, 2018-04-23 08:57:41