Archief - jQuery Post to Webservice | Without CORS on Server

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

bealzebub

Legacy Member
Als je geen controle hebt over de SAP server en je data wil posten via een AJAX call naar een externe server, dan ga je via een proxy moeten werken, je hebt gewoon geen andere keuze.

Eerst efkes kort over je OPTIONS verwarring. De browser is intelligent genoeg om door te hebben dat je een request doet naar een extern domein en dan gaat ie automatisch CORS preflighting gaan doen. Het eerste wat ie dan doet is een OPTIONS header request gaan doorsturen, die de externe server dan moet gaan "goedkeuren". Daarna wordt je effectieve request pas doorgestuurd. Voor CORS ga je dus altijd met twee requests zitten: een handshake-approval en de eigenlijke request. Maar aangezien je SAP server geen CORS heeft, blijft die OPTIONS request onbeantwoord en dus geweigerd en ga je nooit de eigenlijke request zien doorgaan.

Had je enkel GET requests moeten doen, dan was het simpel geweest natuurlijk. SAP ondersteunt bij mijn weten JSONP. Nu, je hebt misschien al ontdekt dat JSONP enkel voor GET requests werkt, da's ook de beperking eraan.

Nu, terug naar het POSTen van data naar je SAP server. Hoe doe je zo'n proxy juist?

  1. Stuur een AJAX call naar een URL van je eigen webapplicatie
  2. In je controller ga je dan die request met z'n POST data doorsturen naar die SAP server (via curl of whatever dat je serverside language ondersteunt).
  3. Het antwoord dat je terugkrijgt van de SAP server kan je gewoon as-is als response van je lokale request terugsturen (of eventueel zelfs herwerken)

Voorbeeld:
Applicatie zit op mijndomein.be

Browser: AJAX call naar http://mijndomein.be/sap_proxy/ met POST data {foo: "bar"}
Server mijndomein: cURL naar sapserver.com met POST data {foo: "bar"}, krijgt response terug {id: 5, foo: "bar} van SAP, render dat als response voor dat request
Browser: krijgt in AJAX callback binnen: {id: 5, foo: "bar"}. Doe ermee wat je wil clientside.

Ik heb het al een paar keer in andere posts in dit forum gezegd: hou er rekening mee dat zo'n request serverside in de meeste talen (PHP, Ruby, Python) blocking is en je dus beter naar een asynchrone versie zoekt. Dat zoek je zelf maar uit want anders mag k hier een volledig boek schrijven :D

AliChemicali

Legacy Member
bealzebub zei:
Als je geen controle hebt over de SAP server en je data wil posten via een AJAX call naar een externe server, dan ga je via een proxy moeten werken, je hebt gewoon geen andere keuze.

Eerst efkes kort over je OPTIONS verwarring. De browser is intelligent genoeg om door te hebben dat je een request doet naar een extern domein en dan gaat ie automatisch CORS preflighting gaan doen. Het eerste wat ie dan doet is een OPTIONS header request gaan doorsturen, die de externe server dan moet gaan "goedkeuren". Daarna wordt je effectieve request pas doorgestuurd. Voor CORS ga je dus altijd met twee requests zitten: een handshake-approval en de eigenlijke request. Maar aangezien je SAP server geen CORS heeft, blijft die OPTIONS request onbeantwoord en dus geweigerd en ga je nooit de eigenlijke request zien doorgaan.

Had je enkel GET requests moeten doen, dan was het simpel geweest natuurlijk. SAP ondersteunt bij mijn weten JSONP. Nu, je hebt misschien al ontdekt dat JSONP enkel voor GET requests werkt, da's ook de beperking eraan.

Nu, terug naar het POSTen van data naar je SAP server. Hoe doe je zo'n proxy juist?

  1. Stuur een AJAX call naar een URL van je eigen webapplicatie
  2. In je controller ga je dan die request met z'n POST data doorsturen naar die SAP server (via curl of whatever dat je serverside language ondersteunt).
  3. Het antwoord dat je terugkrijgt van de SAP server kan je gewoon as-is als response van je lokale request terugsturen (of eventueel zelfs herwerken)

Voorbeeld:
Applicatie zit op mijndomein.be

Browser: AJAX call naar http://mijndomein.be/sap_proxy/ met POST data {foo: "bar"}
Server mijndomein: cURL naar sapserver.com met POST data {foo: "bar"}, krijgt response terug {id: 5, foo: "bar} van SAP, render dat als response voor dat request
Browser: krijgt in AJAX callback binnen: {id: 5, foo: "bar"}. Doe ermee wat je wil clientside.

Ik heb het al een paar keer in andere posts in dit forum gezegd: hou er rekening mee dat zo'n request serverside in de meeste talen (PHP, Ruby, Python) blocking is en je dus beter naar een asynchrone versie zoekt. Dat zoek je zelf maar uit want anders mag k hier een volledig boek schrijven :D


Van mij mag je best een boek schrijven :D

bealzebub

Legacy Member
Begin maar met de normale blocking versie, de non-blocking (bv. threaded) versie kunde dan later via een refactor derin verwerken ;)

Snap je t principe van die proxy?

AliChemicali

Legacy Member
bealzebub zei:
Begin maar met de normale blocking versie, de non-blocking (bv. threaded) versie kunde dan later via een refactor derin verwerken ;)

Snap je t principe van die proxy?

Ik ga da sebiet afprinten en markeren. Eerst het volgende eens lezen:

Code:
Hi Vincent,

Check the following link.

 

HTML5 ROCKS - Using CORS

http://www.html5rocks.com/en/tutorials/cors/?redirect_from_locale=en

 

Preflight Request:

    The preflight request is made as an HTTP OPTIONS request (so be sure your server is able to respond to this method)

 

Hope it helps.

 

Regards,

 

Christian

bealzebub

Legacy Member
Jup, da's exact wa k ik zeg. Die OPTIONS is een preflight check. Maar daar edde dus nix aan als je SAP server geen CORS ondersteunt.

CORS heeft trouwens nix met SAP zelf te maken, t is een webserver configuratie op Apache/nginx (en wrsch ook wel IIS).

Maar t kan zeker geen kwaad van te begrijpen wat CORS is en hoe t in mekaar zit. Je zal daar ook wel direct beseffen waarom er nie veel server admins happig gaan zijn om het in te stellen: t is complex en als je t echt secure wil maken is t nog complexer. Bovendien weten de meeste eigenlijk van toeten nog blazen als t op zo'n dingen aankomt.

AliChemicali

Legacy Member
bealzebub zei:
Jup, da's exact wa k ik zeg. Die OPTIONS is een preflight check. Maar daar edde dus nix aan als je SAP server geen CORS ondersteunt.

CORS heeft trouwens nix met SAP zelf te maken, t is een webserver configuratie op Apache/nginx (en wrsch ook wel IIS).

Maar t kan zeker geen kwaad van te begrijpen wat CORS is en hoe t in mekaar zit. Je zal daar ook wel direct beseffen waarom er nie veel server admins happig gaan zijn om het in te stellen: t is complex en als je t echt secure wil maken is t nog complexer. Bovendien weten de meeste eigenlijk van toeten nog blazen als t op zo'n dingen aankomt.

Gisteren hadden we een simpel idee, force vorige HTTP Header version waar OPTIONS nog niet bestaat. Maar da lukt dus niet :D

AliChemicali

Legacy Member
bealzebub zei:
Jup, da's exact wa k ik zeg. Die OPTIONS is een preflight check. Maar daar edde dus nix aan als je SAP server geen CORS ondersteunt.

CORS heeft trouwens nix met SAP zelf te maken, t is een webserver configuratie op Apache/nginx (en wrsch ook wel IIS).

Maar t kan zeker geen kwaad van te begrijpen wat CORS is en hoe t in mekaar zit. Je zal daar ook wel direct beseffen waarom er nie veel server admins happig gaan zijn om het in te stellen: t is complex en als je t echt secure wil maken is t nog complexer. Bovendien weten de meeste eigenlijk van toeten nog blazen als t op zo'n dingen aankomt.


Dus wat je ook wilt zeggen is dat ik mij niks moet aantrekke van die CORS want als dat op de (web)server niet geconfigureerd is zal dat toch nooit werken.

bealzebub

Legacy Member
MaSSaSLaYeR zei:
Gisteren hadden we een simpel idee, force vorige HTTP Header version waar OPTIONS nog niet bestaat. Maar da lukt dus niet :D

T eeft geen zin om ermee te foefelen en te proberen de beperking van de SAP server te omzeilen. Gans dat AJAX verhaal is in elke browser goed veilig toegespijkerd. En maar best ook, want anders zouden bepaalde evil mensen zich nogal amuseren met XSS peis k :evil:

bealzebub

Legacy Member
MaSSaSLaYeR zei:
Als je een job zoekt, wij zoeken nog mensen voor SAP

Hehehe, k zal t in t achterhoofd houden ;)

18 jaar development, waarvan 12 professioneel en 8 in webdevelopment, dan steek je nogal eens iets op :D K heb daarom ook liefst een omgeving die k volledig onder controle heb (zelfs m'n framework moet opensource zijn da k erin kan fixen als t moet) en niet iets van een ander waar je met een volledig huis staat en enkel nog wa vlaamse koterijen mag bijbouwen ;)

De laatste jaren m'n hart verloren aan Ruby on Rails en Javascript/Coffeescript (zowel NodeJS als pure clientside stuff) en k denk da k mij daar nog wel een tijdje mee zal kunnen bezighouden. Ohja, en nog wat Objective-C on the side, ook wel fun.

AliChemicali

Legacy Member
bealzebub zei:
Hehehe, k zal t in t achterhoofd houden ;)

18 jaar development, waarvan 12 professioneel en 8 in webdevelopment, dan steek je nogal eens iets op :D K heb daarom ook liefst een omgeving die k volledig onder controle heb (zelfs m'n framework moet opensource zijn da k erin kan fixen als t moet) en niet iets van een ander waar je met een volledig huis staat en enkel nog wa vlaamse koterijen mag bijbouwen ;)

De laatste jaren m'n hart verloren aan Ruby on Rails en Javascript/Coffeescript (zowel NodeJS als pure clientside stuff) en k denk da k mij daar nog wel een tijdje mee zal kunnen bezighouden. Ohja, en nog wat Objective-C on the side, ook wel fun.

Phu ruby on rails, ik moet dat ook hier leren. Ik ben niet zo voor open source.
Ik heb meer ervaring met .net & abap & php.

Wij hebben door 10-to-1 een front end laten maken voor SAP en nu moet ik dat overnemen :D



SAP & ABAP is wel tof, alles is mogelijk :) dat zeggen wij toch tegen onze klanten :D

Greetz!

AliChemicali

Legacy Member
bealzebub zei:
Hehehe, k zal t in t achterhoofd houden ;)

18 jaar development, waarvan 12 professioneel en 8 in webdevelopment, dan steek je nogal eens iets op :D K heb daarom ook liefst een omgeving die k volledig onder controle heb (zelfs m'n framework moet opensource zijn da k erin kan fixen als t moet) en niet iets van een ander waar je met een volledig huis staat en enkel nog wa vlaamse koterijen mag bijbouwen ;)

De laatste jaren m'n hart verloren aan Ruby on Rails en Javascript/Coffeescript (zowel NodeJS als pure clientside stuff) en k denk da k mij daar nog wel een tijdje mee zal kunnen bezighouden. Ohja, en nog wat Objective-C on the side, ook wel fun.


Hey Bealzebub,

Kun jij die laatste posts nog volgen?

SAPUI5 Cross-origin resource sharing issues whi... | SCN

Greetz!

bealzebub

Legacy Member
Bon, dus als k t nu goed begrijp gebruik je SAPUI, een clientside MVC framework dat eigenlijk bedoeld is om gemakkelijk met een SAP server ergens te gaan interfacen. Dat is dus (en neem da nie verkeerd op) waarom ik zo tegen hapklare brokken ben waar je als "developer" eigenlijk totaal geen benul hebt van hoe je web stack eigenlijk in mekaar zit.

En nu proberen in lekentaal duidelijk te maken hoe de vork aan de steel zit…*god help me.

Je SAPUI Webserver is eigenlijk een development server die op de achtergrond in gang gestoken wordt om die SAPUI HTML+JS pagina's te serven. Wat die juist is, god weet het, da kan gerust een Jetty of een Tomcat zijn of misschien zelfs (als je onder Visual Studio draait) een Visual Studio webserverke, wat eigenlijk neerkomt op een kleine IIS server. Nu, dat is eigenlijk enkel bedoeld als development server om je SAPUI appje ergens op een lokale poort te gaan hosten. Da's totaal nie bedoeld om in production gebruikt te worden, je gaat die app willen mounten op een echte webserver zoals Apache, nginx of IIS (alhoewel ik m'n reservaties heb over die laatste, maar kom).

Je probleem in development oplossen kan je daar voorlopig rond werken (je problemen zijn nog niet van de baan, je omzeilt ze gewoon tijdelijk). Zoals er daar een paar mensen vermelden kan je in zowat elke browser (of da nu Chrome, Safari of IE en wrsch zelfs Firefox is) die beveiliging voor requests naar externe domeinen afzetten. Zoek zelf op hoe dat moet, je kan ook googlen. Je kan dat echter voor de eindgebruiker niet doen en eigenlijk moet je dat voor jezelf doen in een browser die je voor niets anders zal gebruiken. Het is enorm GEVAARLIJK omdat je jezelf openstelt voor XSS attacks. Met die basic webserver die SAPUI in development gebruikt ga je gewoon nie anders kunnen, da's een very basic server die nie meer doet dan paginakes afleveren. Daarmee ga je dus perfect aan die externe SAP gaan kunnen en je app kunnen afwerken. Maar eens dat af is, ga je je toch echt moeten gaan verdiepen in de echte webserver waar je je app op gaat mounten.

Maar dan begint eigenlijk het echte werk. Je zal al die externe URLs uiteindelijk toch lokaal moeten aanspreken, zoals ik al in de vorige posts uit de doeken deed. Dus alles wat je daar extern aanroept, ga je de url naar een lokale URL moeten aanpassen, die eerst door de webserver zal passeren. Ik heb je een PHP proxy aangeraden omdat ik in de veronderstelling was dat je toch al in PHP bezig was (wat dus niet t geval is) en je je daar dus redelijk in thuisvoelde. Een webserverbased proxy zou idd een betere oplossing zijn, maar da's een bitch om te configureren (maar t zal nodig zijn). Je zal dus voor je production omgeving je SAPUI HTML+CSS code moeten hosten op Apache, nginx of IIS. Persoonlijk zou ik nginx aanraden, die is gemakkelijker te configureren dan Apache, voor IIS moet je eerst een brainwash cursus Microsoft volgen om te geloven dat dat een goeie webserver is.

Het principe van een webserver based proxy komt eigenlijk op hetzelfde neer als die PHP proxy die ik je uitgelegd heb, maar dan al heel robuust geïmplementeerd. Je stuurt vanop de browser dus een request naar mijndomein.be/external/somethingsomething. De webserver krijgt dat binnen en overloopt z'n vhost regeltjes en ziet: owla, ik heb hier een request naar /external en in m'n configuratie staat ingesteld dat als ik die url in kwestie zie, dat ik die moet omvormen naar sapserver.com/somethingsomething en als ik het resultaat krijg, dat ik dat als antwoord moet teruggeven.

Hoe je die proxyregels moet instellen in je vhost config hangt af van de webserver die je gebruikt en is eigenlijk een vak op zichzelf. Ik ga zelfs meer zeggen, je zal er waarschijnlijk (gezien je kennis momenteel) als je t zelf wil doen een boek voor moeten lezen of alleszins enorm veel opzoeken en trial en error werk doen. Ofwel laat je een externe consultant dat werk voor je doen (en nee, dank u, ben geen kandidaat ;)).

Een framework gebruiken zonder alles te snappen dat errond hangt doet mij altijd aan die schitterende quote van Homer Simpson denken: "Ooh, look at me! I'm making people happy! I'm the Magical Man from Happy-Land, in a gumdrop house on Lollipop Lane!". Alles is goed zolang het werkt en het doet alles automagisch…*en dan werkt het nie meer en je weet gewoon nie waarom.

Samengevat, in development kun je je er gemakkelijk vanaf maken en je browser in onveilige modus zetten om iets gedaan te krijgen. Eens je app af is, zal je via een proxy moeten werken (op webserverniveau) en daarvoor heb je uitgebreide kennis nodig van de webserver die je in production gaat gebruiken om de app op te hosten. Hebben jullie die niet in huis, dan ga je daar professionele hulp voor moeten zoeken.

Ik weet dat het allemaal een beetje cru mag klinken, maar ik kan in dit geval nie veel anders dan de feiten op een rij te zetten. Ik doe het om je te helpen, maar k vrees ervoor dat alles wa k zeg je waarschijnlijk al als chinees in de oren zal klinken :p
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan