52 messaggi dal 21 gennaio 2002
Ciao a tutti, su un sito sto usando HMLHTTP per fare login su un sito esterno.

Ho scritto il codice provandolo sul server che ho in ufficio, funziona senza alcun problema. Provando ad installarlo sul sito del cliente presso "Hoster1", non funziona più. Allora l'ho provato su altri due siti miei, uno presso "Hoster1" e uno presso "Hoster2", entrambi funzionano, ed anche contemporaneamente tra loro e contemporaneamente all'installazione sul mio server in ufficio.

Ma sul sito del cliente no. Non riesco a capire perché. Spero nell'intervento di qualcuno dalle capacità superiori alle mie che possa spiegarmi cosa succede, non riesco a capire dove stia il problema; sono assolutamente bloccato e non so più dove cercare o cosa provare.

Grazie mille, Buon Natale a tutti.

bulabula
11.886 messaggi dal 09 febbraio 2002
Contributi
bulabula ha scritto:
Spero nell'intervento di qualcuno dalle capacità superiori


Hehehe, sto valutando 1,255,862,992 milioni di ipotesi, attendere...

...
Fatto!

Può essere che la pagina asp e lo script che invochi con XMLHTTPRequest si trovino su due domini diversi?
Il browser impone una politica restrittiva chiamata same-origin policy che ti costringe ad effettuare richieste sempre sullo stesso dominio di origine. Leggi qui:
http://it.wikipedia.org/wiki/Same_origin_policy

In particolare leggi il paragrafo "Regole per la determinazione dell'origine" che ti mostra alcuni esempi. Addirittura è sufficiente che il procollo (http/https) sia diverso per veder fallire la richiesta.

Assicurati che i domini e il protocollo in uso siano identici. Se non dovesse essere questo il motivo, allora prova ad usare Firebug o la console di IE (tasto F12) per capire se la XmlHttpRequest almeno viene effettuata e se, eventualmente, il server risponde e in che modo.

ciao, Buone feste!!

Enjoy learning and just keep making
52 messaggi dal 21 gennaio 2002
Ciao, innanzitutto grazie per avermi risposto!
Direi però che la same origin policy non c'entri molto...:

1 - Innanzitutto questo MioSito che sto facendo va a recuperare, attraverso la XmlHttpRequest, dati da SitoFinanziario1, penso statunitense.

2 - Per estrarre i dati da SitoFinanziario1, sempre con XmlHttpRequest invoco la pagina del controllo del login passando i dati di autenticazione nella querystring. Una volta che la pagina è stata caricata posso chiamare, sempre con XmlHttpRequest, le altre pagine coi dati che mi interessa reperire. A questi URL senza login apparirebbero pagine vuote.

3 - Ho provato a mettere e ad eseguire i miei script su:
- il mio server nella mia LAN
- un mio dominio ospitato presso Hoster1
- un mio dominio ospitato presso Hoster2
Tutto funziona, ed ovviamente la pagina asp e lo script che invoco con XMLHTTPRequest si trovano su due domini diversi.

4 - Ho provato a mettere e ad eseguire i miei script su
- il dominio del cliente ospitato presso Hoster2
In questo caso lo script non funziona, nel senso che la pagina del controllo del login passando i dati di autenticazione nella querystring viene caricata, senza il mio nome utente riconosciuto, e le altre pagine coi dati appaiono vuote.

Visto che sugli altri domini tutto funziona, non dev'essere un problema di script, e nemmeno di same origin policy, perché in tutti i casi che ho provato, anche funzionanti, i domini sono diversi...

Dove sbaglio?

bulabula
52 messaggi dal 21 gennaio 2002
Aggiungo un altro dettaglio (per me angosciante). Nella pagina che dovrebbe fare login ma non lo fa, ho fatto in modo di visualizzare l'url utilizzato per il login con la richiesta XmlHttp. Nell'esecuzione della pagina il link non funziona, ma se lo copio e lo incollo nel mio browser, il login viene effettuato correttamente!

bulabula
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

bulabula ha scritto:

2 - Per estrarre i dati da SitoFinanziario1, sempre con XmlHttpRequest invoco la pagina del controllo del login passando i dati di autenticazione nella querystring. Una volta che la pagina è stata caricata posso chiamare, sempre con XmlHttpRequest, le altre pagine coi dati che mi interessa reperire.

giusto per essere sicuro di aver capito: il "login" e "le altre pagine" si trovano su SitoFinanziario1, giusto?

bulabula ha scritto:

1 - Innanzitutto questo MioSito che sto facendo va a recuperare, attraverso la XmlHttpRequest, dati da SitoFinanziario1, penso statunitense.


ok, tieni presente che il browser applica la same origin policy anche in questo caso. Se riesci a recuperare i dati, è perché SitoFinanziario1 ne ha esplicitamente consentito l'accesso da altre origini (cioè da altri domini).
Puoi verificare questa cosa incollando l'URL che richiami mediante l'XMLHttpRequest nella barra degli indirizzi del browser. Usando Firebug o la console di IE (tasto F12) potresti notare che tra le intestazioni della risposta c'è questa - molto permissiva - che consente a qualunque dominio di accedere ai dati:
Access-Control-Allow-Origin:*


Il Cross-Origin Resource Sharing (CORS) è una specifica del W3C che consiste in intestazioni HTTP come la già citata Access-Control-Allow-Origin che permettono al server di ridefinire le restrizioni della same-orgin policy.

Anche Flickr, ad esempio, consente a tutti di consumare le sue API infatti se visiti questo indirizzo vedrai che con la risposta ti arriva anche l'intestazione Access-Control-Allow-Origin:*

Il feed di aspitalia su questa discussione, invece, non è accompagnato da quella intestazione e perciò non potrai scaricarlo con XmlHttpRequest perché il browser applicherà le normali restrizioni imposte dalla same-origin policy.
Se provi comunque ad accederci, la richiesta non produrrà il risultato che ti aspetti e nella console di Google Chrome, ad esempio,vedresti un errore simile a quello di questa immagine.
XMLHttpRequest cannot load http://forum.aspitalia.com/forum/ws/rss.aspx?ThreadID=385976. Origin http://localhost/ is not allowed by Access-Control-Allow-Origin.


Dato che, come dici ai punti 3 e 4, l'unica cosa che cambia è il dominio mi è venuto in mente che il problema potrebbe esser causato dalla same-origin policy e dall'assenza dell'opportuna intestazione Access-Control-Allow-Origin.
Sulla base di quello che ci siamo detti finora, non ti saprei ancora dire perché il problema si presenti solo sul dominio del cliente. Quindi, per fare un passo avanti dovresti:
  • Usare Firebug o la console di Google Chrome / IE, o altro strumento per verificare che XmlHttpRequest stia correttamente effetuando la richiesta. Poi, sempre con i medesimi strumenti, verificare qual è la risposta del server (ammesso che una risposta venga restituita).
  • Riportare qui nel forum le intestazioni HTTP e la risposta del server. A volte nella risposta si trovano degli errori che ti aiutano a capire il problema.


= Oppure =

Se la tua applicazione non contiene user e password in chiaro, posta direttamente i link a Hoster1 e al dominio del cliente così che gli si può dare un'occhiata direttamente.

ciao
Modificato da BrightSoul il 27 dicembre 2011 13.41 -

Enjoy learning and just keep making
52 messaggi dal 21 gennaio 2002
BrightSoul ha scritto:
ciao,

[...]

= Oppure =

Se la tua applicazione non contiene user e password in chiaro, posta direttamente i link a Hoster1 e al dominio del cliente così che gli si può dare un'occhiata direttamente.

ciao

Wow.. quanta roba! Grazie per l'attenzione che mi stai dedicando..

Ecco dei link dove si può vedere il problema. Gli script sono identici ma ospitati presso domini diversi.
Username e password sono in chiaro, ma sono account di prova quindi nessun problema.

Le operazioni effettuate sono queste:

- creazione dell'URL della pagina di Login
- visualizzazione dell'url di login, chiamata dell'url, attesa della risposta, visualizzazione pagina risultante
- creazione dell'URL della pagina di estrazione dati
- visualizzazione dell'url pagina di estrazione dati, chiamata dell'url, attesa della risposta, visualizzazione pagina risultante: se il login ha successo i dati sono visibili, altrimenti il server restituisce una pagina vuota

Links:

Sito 1 su Hoster1: Funzionante
Sito 2 su Hoster2: Funzionante
Sito 3 su Hoster2: Funzionante
Sito cliente su Hoster2: NON Funzionante

Ed infine, il codice utilizzato:
<%

  strLoginUrl = ""
  strLoginUrl = strLoginUrl & "https://www.magicformulainvesting.com/Marketing/Login?email=ddaayy@tiscali.it&passwd=prova"
  strLoginUrl = strLoginUrl & "&loginURL=https://www.magicformulainvesting.com/login.html"
  strLoginUrl = strLoginUrl & "&changePwdURL=https://www.magicformulainvesting.com/change_password.html"
  strLoginUrl = strLoginUrl & "&ActivateAcctURL=https://www.magicformulainvesting.com/activate_account.html"
  strLoginUrl = strLoginUrl & "&StockScreenerURL=https://www.magicformulainvesting.com/stock_screener.html"
  Response.Write "<p>" & strLoginUrl & "</p>"
  Set PaginaMFI = Server.CreateObject("Msxml2.XMLHTTP")
  PaginaMFI.Open "GET", strLoginUrl, False
  PaginaMFI.Send()
  Response.Write PaginaMFI.ResponseText
  
  strPagina = "https://www.magicformulainvesting.com/Marketing/GetStocks?stocknum=6&minval=50"
  Response.Write "<p>" & strPagina & "</p>"
  PaginaMFI.Open "GET", strPagina, False
  PaginaMFI.Send()
  Response.Write PaginaMFI.ResponseText
  Set PaginaMFI = Nothing

%>

Modificato da bulabula il 27 dicembre 2011 17.47 -

bulabula
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
non avevo capito che stessi utilizzando l'oggetto XMLHTTP lato server. Pensavo che stessi facendo delle chiamate ajax dal client, per quello parlavo di same-origin policy che in questo caso non c'entra nulla dato che le chiamate partono dal server.

Ora penso di aver capito il problema: tu fai due chiamate al sito finanziaro e con la prima ti logghi mentre con la seconda ottieni i dati. Alla prima chiamata, il sito finanziario allega alla risposta un cookie di autenticazione che DEVI reinviare in tutte le successive chiamate per provare la tua identità. E' il meccanismo di autenticazione più comune sul web.
Però, alla seconda richiesta, quando chiedi i dati a /Marketing/GetStocks, non aggiungi quel cookie che ti era stato fornito in precedenza e, in linea teorica, il sito finanziario non avrebbe modo di verificare la tua identità e di sapere che sei tu lo stesso che ha effettuato il login pochi istanti prima. Nonostante tu non fornisca il cookie, sorprendentemente funziona lo stesso. Probabilmente è l'oggetto XMLHTTP che assembla la richiesta per te e ci butta dentro il cookie.

Se sul sito del cliente il comportamento è diverso non è a causa del differente dominio, del server che potrebbe essere configurato in maniera diversa dagli altri. Qui non mi avventuro perché non conosco l'XMLHTTP (e tutte le sue versioni) in maniera approfondita né i server in uso. Una prova che puoi fare è sostituire Msxml2.XMLHTTP con MSXML2.ServerXMLHTTP. Il primo è pensato per applicazioni client-side, mentre il secondo per il server.
Oppure, chiedi a Hoster2 che differenza c'è tra il server usato per il tuo sito e quello su cui si trova il sito del cliente. Eventualmente fagli presente il problema che stai riscontrando e chiedi (se gratuito) che il sito venga spostato sullo stesso server su cui si trova il tuo sito.

Comunque, come hai constatato, questa soluzione è fragile e non sono neanche tanto sicuro che quelli del sito finanziario vogliano che i loro contenuti siato inglobati in altre pagine. Oltretutto, se provi a premere il tasto "Get stocks" vedrai che non funziona.

La soluzione sarebbe stata usare un iframe, in modo che l'utente avrebbe visto una cornice nella tua pagina all'interno della quale avrebbe potuto interagire con le pagine del sito finanziario, visibili dal loro dominio.
<iframe src="https://www.magicformulainvesting.com/Marketing/Login?email=tuaemail...ecc..." width="800" height="600"></iframe>

Tuttavia vedo che hanno scritto del javascript proprio per evitare che i loro contenuti venissero rinchiusi in una cornice. Se provi ad usare un iframe, infatti, avverrà una navigazione al sito finanziario posto a tutta pagina.

ciao
Modificato da BrightSoul il 27 dicembre 2011 17.29 -

Enjoy learning and just keep making
52 messaggi dal 21 gennaio 2002
BrightSoul ha scritto:

[...]
Una prova che puoi fare è sostituire Msxml2.XMLHTTP con MSXML2.ServerXMLHTTP. Il primo è pensato per applicazioni client-side, mentre il secondo per il server.
[...]
ciao


Ha funzionato! Non sapevo che fossero due cose distinte, e quindi con usi diversi, mi chiedo come avesse fatto a funzionare negli altri casi!

Comunque ora pare funzionare perfettamente, ti ringrazio tantissimo perché ero veramente arenato!

Per quanto riguarda le tue considerazioni sul "pescaggio" dei dati, mi rendo conto che la mia soluzione sia un po' precaria. D'altra parte ho cercato di automatizzare il reperimento dei dati non tanto per la visualizzazione, ma per una successiva elaborazione da parte del mio codice. L'alternativa usata finora era però un copia/incolla manuale, quindi i dati venivano usati lo stesso, e verranno comunque nuovamente reperiti in questo modo in caso di blocco.

Una considerazione tecnica: secondo me il fatto che "Get Stocks" non funzioni dovrebbe essere normale: è il mio sito, il mio codice, il mio oggetto che ha fatto la richiesta e si è autenticato, e anche se mostra l'html ottenuto, il pulsante è sulla pagina del client, e quella sessione non c'entra nulla con la sessione che il sito ha aperto sul sito finanziario...

Ti ringrazio ancora tantissimo, mi hai veramente risolto la giornata! Grazie grazie grazie!

bulabula

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.