Snelle tip Google App Engine gebruiken als een proxyserver

Google App Engine kan worden gebruikt als een gratis en handige manier om beperkende of ontbrekende crossdomeinbeleidbestanden te omzeilen. Deze zelfstudie laat u zien hoe u een GAE-proxy maakt die toegang biedt tot beperkte bronnen voor uw Flash-toepassing.


Eindresultaat voorbeeld

Laten we eens kijken naar het eindresultaat waar we naartoe zullen werken:

Dat heeft zojuist enkele testgegevens naar een externe spreadsheet gestuurd die wordt gehost in Google Documenten. Dit zou niet werken zonder een crossdomain.xml-bestand op het ontvangende domein - maar het bestand met het crossdomeinbeleid op Google Documenten staat dit niet toe, en ik kan het niet wijzigen. Lees verder om erachter te komen hoe dit is gebeurd.


Waarom een ​​proxy gebruiken?

In mijn laatste Quick Tip A-gids voor het doorbladeren van domeinbeleidsbestanden toonde ik hoe cross-domein beleidsbestanden door Flash worden gebruikt om te bepalen welke gegevens toegankelijk zijn vanuit externe domeinen. Het is geweldig voor beheerders om de toegang tot bronnen te beheren, maar het is lastig voor Flash-ontwikkelaars die proberen toegang te krijgen tot gegevens op een server die geen beleidsbestand voor een cross-domein heeft, omdat geen beleidsbestand geen toegang betekent. Het instellen van een bestand met een crossdomeinbeleid kan eenvoudig over het hoofd worden gezien en ik heb meerdere webserviceproviders tegen het lijf gelopen die niet dachten aan Flash-ontwikkelaars..

Ik heb ook gezegd dat het probleem gemakkelijk kon worden omzeild door gebruik te maken van een proxy. Het idee achter een proxy is dat deze verbindingen accepteert van externe Flash-toepassingen (door het juiste crossdomain.xml-bestand aan te leveren) en vervolgens fungeert als tussenpersoon die gegevens heen en weer doorgeeft. De enige echte vereiste van een proxyserver (in verband met Flash) is dat deze toegang moet hebben tot openbare bronnen, ongeacht de machtigingen die al dan niet worden verleend door een cross-domeinbeleid.

Het echte goede nieuws is dat je zo'n proxy zonder vooraf gemaakte kosten kunt instellen met behulp van Google App Engine (GAE). GAE host een webtoepassing en ervan uitgaande dat uw verkeervereisten onder hun drempelwaarde liggen, zijn er geen kosten. Wat ik hier zal laten zien, is hoe je een eenvoudige GAE-webtoepassing kunt maken die als een proxy kan fungeren, waardoor Flash-toepassingen toegang hebben tot bronnen die anders niet toegankelijk zijn.


Stap 1: Google Spreadsheets en het gevreesde crossdomain.xml

Er is een heel handige functie in Google Documenten waarmee u een webformulier kunt maken dat kan worden gebruikt om een ​​spreadsheet te vullen. Ik heb hier zo'n formulier opgesteld, en de resultaten van dit formulier worden hier als een openbare webpagina gepubliceerd. Het formulier is een standaard HTML-formulier, dat programmatisch kan worden ingediend met behulp van een standaard HTTP POST-bewerking.

Ik was onlangs in een positie waar ik feedback moest verzamelen van een Flash-applicatie die ik had gedistribueerd. Deze vormen leken een geweldige manier om dat te doen. Er waren geen hostingkosten voor mij, de resultaten konden eenvoudig rechtstreeks door de spreadsheet worden geanalyseerd, en ik kon er vrij zeker van zijn dat een Google-service zoals Docs betrouwbaar zou zijn. Het enige probleem was het cross-domeinbeleid.

    

Dit specifieke beleidsbestand geeft geen toegang tot het http://spreadsheets.google.com/-domein voor externe Flash-toepassingen. En inderdaad, als u een formulier programmatisch vanuit Flash verzendt, zal het mislukken.

Dit is een perfect voorbeeld waar een proxy kan helpen.


Stap 2: Maak een GAE-toepassing

Meld u aan voor een App Engine-account. U wordt gevraagd om een ​​nieuwe applicatie te maken. Hier heb ik een applicatie gemaakt genaamd activetutsproxydemo. U moet uw eigen unieke applicatienaam kiezen.


Stap 3: Verkrijg de GAE SDK

Download en installeer de App Engine-SDK. Hiermee wordt een applicatie met de naam Google App Engine Launcher geïnstalleerd. Voer het uit en klik op Bestand | Nieuwe applicatie maken ...

Typ de naam van de toepassing die u in stap 1 hebt gemaakt, selecteer een locatie voor de bestanden van de toepassing die moeten worden opgeslagen en klik op de creëren knop.


Stap 4: Pas het bestand main.py aan

De Google App Engine Launcher maakt een standaardtoepassing voor u in de map die u hebt opgegeven. U zou een bestand met de naam main.py moeten zien Overschrijf de inhoud van dit bestand met de volgende Python-code:

 van google.appengine.ext import webapp van google.appengine.ext.webapp.util import run_wsgi_app import urllib van google.appengine.api importeer urlfetch-klasse GoogleForm (webapp.RequestHandler): def post (self): destinationURL = "http: / /spreadsheets.google.com/formResponse?formkey=dHh4VTRVbGtSM3ZycUtpbEFKSUJ2Znc6MA&ifq "form_fields = " entry.0.single ": self.request.get ('entry.0.single')," entry.1.single ": self.request .get ('entry.1.single'), "entry.2.single": self.request.get ('entry.2.single'), "entry.3.single": self.request.get (' entry.3.single '), "pageNumber": "0", "backupCache": "", "submit": "Submit" form_data = urllib.urlencode (form_fields) result = urlfetch.fetch (url = destinationURL, payload = form_data, methode = urlfetch.POST, headers = 'Content-type': 'application / x-www-form-urlencoded') printresultaatklasse CrossDomain (webapp.RequestHandler): def get (self): self.response .headers ['Content-type'] = 'text / xml' self.response.out.write ("" "   "" ") toepassing = webapp.WSGIApplication ([('/ googleform', GoogleForm), ('/crossdomain.xml', CrossDomain)], debug = True) def main (): run_wsgi_app (applicatie) if __name__ ==" __main__ ": main ()

U kunt meer informatie vinden over hoe deze code werkt in de GAE-documentatie, maar ik zal de belangrijke stukjes hier benadrukken.

Deze regel zegt dat het GoogleForm klasse wordt uitgevoerd wanneer het http://youapplicationname.appspot.com/googleform-adres wordt geopend en de Domeinoverschrijdende klasse wordt uitgevoerd wanneer het adres http://youapplicationname.appspot.com/crossdomain.xml wordt geopend.

toepassing = webapp.WSGIA-toepassing ([('/ googleform', GoogleForm), ('/crossdomain.xml', CrossDomain)], debug = True)

De Domeinoverschrijdende class zal een crossdomeinbeleidsbestand uitvoeren dat volledige toegang tot het domein toestaat door externe Flash-toepassingen.

 class CrossDomain (webapp.RequestHandler): def get (self): self.response.headers ['Content-Type'] = 'text / xml' self.response.out.write ("" "   "" ")

De GoogleForm class wordt gebruikt om de binnenkomende HTTP POST-aanvraag door te geven aan het Google Documenten-formulier.

class GoogleForm (webapp.RequestHandler): def post (self):

De Bestemmings URL variabele definieert de URL waarnaar het formulier zal posten (nee, dit is niet hetzelfde als de URL die wordt gebruikt om het formulier te bekijken, maar eerder de URL die is toegewezen aan de het formulier tag actie attribuut.

destinationURL = "http://spreadsheets.google.com/formResponse?formkey=dHh4VTRVbGtSM3ZycUtpbEFKSUJ2Znc6MA&ifq"

De form_fields variabele brengt de binnenkomende HTTP POST-variabelen in kaart met die welke moeten worden geleverd aan het Google-formulier.

form_fields = "entry.0.single": self.request.get ('entry.0.single'), "entry.1.single": self.request.get ('entry.1.single'), " entry.2.single ": self.request.get ('entry.2.single')," entry.3.single ": self.request.get ('entry.3.single')," pageNumber ":" 0 "," backupCache ":" "," submit ":" Verzenden "

De gegevens in de velden zijn URL-gecodeerd. Dit is een beetje overbodig, omdat ze al zouden moeten worden gecodeerd door de Flash-applicatie wanneer ze worden verzonden, maar het doet geen pijn om er zeker van te zijn.

form_data = urllib.urlencode (form_fields)

De gegevens worden vervolgens opnieuw gepost naar de Google-servers en het resultaat wordt opgeslagen in de resultaat veranderlijk.

result = urlfetch.fetch (url = destinationURL, payload = form_data, methode = urlfetch.POST, headers = 'Content-type': 'application / x-www-form-urlencoded')

Het resultaat wordt vervolgens afgedrukt, waardoor het wordt teruggestuurd naar de Flash-toepassing.

afdrukresultaat

Stap 5: Upload de applicatie

Selecteer uw GAE-toepassing in de Google App Engine Launcher en klik op de knop Implementeren.

U wordt gevraagd om uw Google-inloggegevens en vervolgens wordt de toepassing geüpload.


Stap 6: Test uw toepassing

Ga naar http://yourapplicationname.appspot.com/crossdomain.xml (u kunt mijn crossdomain.xml-bestand hier bekijken). Als alles goed is gegaan, zou u een XML-bestand moeten zien (mogelijk moet u de paginabron bekijken om het beleidsbestand te zien).

Als u iets ziet dat lijkt op de afbeelding hierboven, is uw GAE-webtoepassing actief.


Stap 7: Toegang tot het formulier met Flex

Het onderstaande MXML-bestand is een voorbeeld van hoe u een HTTP POST-actie uitvoert met behulp van de HTTPService klasse.

     

De variabelen variabele brengt de POST-variabelenamen naar de gegevens die worden verzonden.

var variables: Object = new Object (); variabelen ["entry.0.single"] = "test0"; variabelen ["entry.1.single"] = "test1"; variabelen ["entry.2.single"] = "test2"; variabelen ["entry.3.single"] = "test3";

Vervolgens maken we een nieuw exemplaar van de HTTPService klasse.

var service: HTTPService = nieuwe HTTPService ();

We moeten aangeven naar welke URL we POSTing zullen sturen. Voor deze eerste test proberen we direct naar het Google-formulier te POSTen. Dit zal eigenlijk falen, maar het is een goede demonstratie van waarom we in de eerste plaats een proxy moeten gebruiken.

service.url = "http://spreadsheets.google.com/formResponse?formkey=dHh4VTRVbGtSM3ZycUtpbEFKSUJ2Znc6MA&ifq";

We vertellen het HTTPService object dat we in reactie hierop platte tekst verwachten.

service.resultFormat = HTTPService.RESULT_FORMAT_TEXT;

We moeten het ook vertellen aan de HTTPService object dat we een HTTP POST-bewerking willen uitvoeren.

service.method = "POST";

Sommige gebeurtenishandlers zijn ingesteld om ons te laten weten of de bewerking succesvol was of niet.

service.addEventListener (ResultEvent.RESULT, function (event: ResultEvent): void Alert.show ("Gegevens zijn met succes verzonden!");); service.addEventListener (FaultEvent.FAULT, function (event: FaultEvent): void Alert.show ("Er was een fout!"););

Ten slotte sturen we de gegevens uit.

service.send (variabelen);

Stap 8: compileer de toepassing

Als u de toepassing compileert en uitvoert met de knop met de groene pijl erop, zult u merken dat deze echt werkt.

Dus wat is het probleem? Waarom zou je alle moeite doen om een ​​proxy te maken? Welnu, de toepassing werkt op uw lokale computer omdat de / bin-debug / directory waar Flex de gecompileerde SWF plaatst een vertrouwde locatie is. Dit betekent dat de applicatie toegang heeft tot de Google-server. Om te simuleren hoe de applicatie op een website zou werken, moet u wel een release-versie compileren.

Nu, wanneer u de SWF vanuit de / bin-release / map uitvoert, ziet u dat de bewerking is mislukt. Dit is hoe de SWF zal handelen wanneer deze wordt geüpload naar een website.


Stap 9: De proxy gebruiken

Het gebruik van de GAE-proxy is een eenvoudig geval van het wijzigen van de URL die is toegewezen aan de HTTPService voorwerp.

service.url = "http://activetutsproxydemo.appspot.com/googleform";

Wanneer u nu de toepassing uitvoert vanuit de mappen bin-debug of bin-release, wordt de bewerking met succes voltooid.


Conclusie

Als u een Google App Engine-proxytoepassing maakt, heeft u eenvoudig toegang tot bronnen op servers die Flash-toepassingen anders zouden uitsluiten. Zolang uw toepassing geen enorme middelen vereist, moet u vaststellen dat u de drempelwaarden voor de gratis GAE-service niet overschrijdt.

Laat u echter niet verleiden om een ​​meer algemene proxy te maken. Hoewel het mogelijk zou zijn om een ​​proxy te maken die een speciale variabele gebruikte om de bestemmings-URL te bepalen, waardoor de applicatie in staat was om als een proxy voor elke resource te fungeren, zou een dergelijke server snel door andere ontwikkelaars worden geëxploiteerd. Hier hebben we de bestemmings-URL hard gecodeerd, wat betekent dat in het ergste geval iemand deze proxy kan gebruiken om gegevens door te geven aan het Google Documenten-formulier. Dit maakt het van weinig nut voor iemand anders en vermindert de waarschijnlijkheid dat de dienst zal worden misbruikt.

Ik hoop dat je deze tutorial leuk vond, bedankt voor het lezen!