[java] & [angularjs] add token header aan een form

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Red devil
  • Registratie: December 1999
  • Laatst online: 13:55
Beste tweakerts,

N.a.v. deze topic [java] HtmlTextInput en HtmlPasswordInput uit HtmlForm is het gelukt om de user/password fields en submit button te identificeren.

Nu het volgende probleem :-), nadat de button click wordt uitgevoerd krijg ik niet de juiste pagina terug, hij doet geen submit. Dit is de code:

code:
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
HtmlPage landing_page = null;

        webClient = new WebClient(BrowserVersion.CHROME);
        webClient.getOptions().setJavaScriptEnabled(true);
        webClient.getOptions().setRedirectEnabled(true);
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.getOptions().setCssEnabled(false);
        webClient.getOptions().setUseInsecureSSL(true);
        webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
        webClient.getCookieManager().setCookiesEnabled(true);

         webClient.getCache().setMaxSize(0);
         final HtmlPage loginpage = webClient.getPage(this.login_url);

         List<HtmlForm> forms_from_login_page = loginpage.getForms();
         HtmlForm form_from_login_page = forms_from_login_page.get(0);
         
         String token = get__RequestVerificationToken(loginpage.asXml());
         WebRequest web_req = loginpage.getWebResponse().getWebRequest();
         web_req.setAdditionalHeader("__RequestVerificationToken", token);
    
         HtmlTextInput userNameTextField = loginpage.getHtmlElementById("user-input");
         HtmlPasswordInput passwordTextField = loginpage.getHtmlElementById("password-input");

         userNameTextField.setValueAttribute(this.profile_id);
         passwordTextField.setValueAttribute(this.password);

         DomElement button = loginpage.getElementById("sign-in-btn");
//         button.setAttribute("type", "submit");
         landing_page = button.click();


Ik heb inmiddels uitgevonden dat er zo'n CSRF achtige code moet worden meegestuurd. Deze extraheer ik met de methode get__RequestVerificationToken en voeg ik als extra additional header mee. Heb met een print op de page.getWebResponse().getWebRequest().getAdditionalHeaders() gechecked dat ze daadwerkelijk zijn toegevoegd. Waarschijnlijk mis ik nog iets, iemand enig idee?

Beste antwoord (via Red devil op 02-07-2017 15:36)


  • Merethil
  • Registratie: December 2008
  • Laatst online: 08-10 16:12
Zoals Hydra al zei in je vorige topic, het is dus een Angular site, wat inhoudt dat ze via Javascript naar een backend API calls doen. Je zou in de pagina kunnen kijken wat het adres van hun API is en die gebruiken ipv het scrapen zoals je nu doet.

Voordeel is dat er dan ook niets breekt als ze de voorkant wijzigen, alleen als de API daadwerkelijk anders wordt.

Alle reacties


Acties:
  • +1 Henk 'm!

  • DixxyJS
  • Registratie: Juni 2017
  • Laatst online: 14-09-2021
Ik zie dat de regel waar je setAttribute toewijst aan je button is uitgecommentarieerd, is dat niet iets wat je toevallig over het hoofd hebt gezien?

Acties:
  • 0 Henk 'm!

  • Red devil
  • Registratie: December 1999
  • Laatst online: 13:55
DixxyJS schreef op zondag 2 juli 2017 @ 09:54:
Ik zie dat de regel waar je setAttribute toewijst aan je button is uitgecommentarieerd, is dat niet iets wat je toevallig over het hoofd hebt gezien?
Oh ja, ik zie het. Nee was even een testje, maakt jammergenoeg niks uit. Misschien moet ik eens met iets gaan opnemen wat een succesvolle (via reguliere browser) login met zich meebrengt qua headers en parameters? Zodat je dat kunt gaan inbouwen?

Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 08-10 16:12
Zoals Hydra al zei in je vorige topic, het is dus een Angular site, wat inhoudt dat ze via Javascript naar een backend API calls doen. Je zou in de pagina kunnen kijken wat het adres van hun API is en die gebruiken ipv het scrapen zoals je nu doet.

Voordeel is dat er dan ook niets breekt als ze de voorkant wijzigen, alleen als de API daadwerkelijk anders wordt.

Acties:
  • 0 Henk 'm!

  • Red devil
  • Registratie: December 1999
  • Laatst online: 13:55
Merethil schreef op zondag 2 juli 2017 @ 11:07:
Zoals Hydra al zei in je vorige topic, het is dus een Angular site, wat inhoudt dat ze via Javascript naar een backend API calls doen. Je zou in de pagina kunnen kijken wat het adres van hun API is en die gebruiken ipv het scrapen zoals je nu doet.

Voordeel is dat er dan ook niets breekt als ze de voorkant wijzigen, alleen als de API daadwerkelijk anders wordt.
Dat is geen slechte suggestie, ik zal eens wat meer informatie zoeken mbt het vinden en aanroepen van die API. Lijkt zeker een stuk robuuster dan het scrapen van de html code.