Quick Tips: Bruk Google App Engine som en proxy-server
Del
Del
en
Share < .no> Dette Cyber mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.
Google App Engine kan brukes som en gratis og enkel måte rundt restriktiv eller mangler kryssdomenepolicyfiler. Denne veiledningen vil vise deg hvordan du oppretter en GAE proxy som gir tilgang til begrensede ressurser for Flash-applikasjon.
Endelig resultat Forhåndsvisning
La oss ta en titt på det endelige resultatet vil vi jobbe mot:
Det er bare sendt noen testdata til en ekstern regneark vert på Google Docs. Dette ville ikke fungere uten en crossdomain.xml fil på mottaker domene - ennå, korset domenepolicyfilen på Google Docs tillater ikke dette, og jeg kan ikke endre det. Les videre for å finne ut hvordan dette ble gjort.
Hvorfor bruke en proxy?
I min siste Quick Tips A Guide to Cross domenepolicy filer viste jeg deg hvordan kryssdomenepolicyfiler brukes av Flash for å bestemme hvilke data kan nås fra eksterne domener. Mens være i stand til å kontrollere tilgangen til ressurser er stor for administratorer, er det en smerte for Flash-utviklere prøver å få tilgang til data på en server som ikke har et kors domenepolicyfilen, siden ingen policyfilen betyr ingen tilgang. Sette opp et kors domenepolicyfilen kan lett oversett, og jeg har kjørt inn mer enn én nettside tjenesteleverandør som ikke tror å imøtekomme for Flash-utviklere.
Jeg har også nevnt at problemet ble lett omgått ved bruk av en proxy. Ideen bak en proxy er at den vil akseptere kobles fra eksterne Flash-applikasjoner (ved å levere den aktuelle crossdomain.xml fil), deretter fungerer som mellomledd bestått data frem og tilbake. Den eneste virkelige kravet til en proxy-server (som gjelder Flash) er at det skal være i stand til å få tilgang til offentlige ressurser uavhengig av tillatelser som kan eller ikke kan gis av et kors domenepolicy.
Den virkelig gode nyheten er at du kan sette opp en slik fullmakt uten foran kostnader ved hjelp av Google App Engine (GAE). GAE vil avholde en webapplikasjon, og forutsatt at trafikken krav er under deres terskel, det er gratis. Hva jeg vil demonstrere her er hvordan man skal lage en enkel GAE webapplikasjon som kan fungere som en proxy, slik at Flash-applikasjoner for å få tilgang til ressurser som ellers ville være utenfor grensene
Trinn 1:. Google Spreadsheets og fryktede crossdomain.xml
Det er en veldig fin funksjon i Google Docs som lar deg lage et webskjema som kan brukes til å fylle et regneark. Jeg har satt opp nettopp en slik form her, med resultatene av denne formen blir publisert som en offentlig nettside her. Skjemaet er en standard HTML-skjema, som kan sendes inn programmatisk ved hjelp av en standard HTTP POST operasjon.
Jeg var nylig i en posisjon hvor jeg trengte å samle noen tilbakemeldinger fra en Flash-applikasjon jeg hadde fordelt. Disse skjemaene virket som en fin måte å gjøre det. Det var ingen hosting kostnader for meg, resultatene kan være lett analyseres direkte av regnearket, og jeg kan være ganske sikker på at en Google-tjeneste som Docs ville være pålitelig. Det eneste problemet var korset domenepolicy
. ≪? Xml version = "1.0" >? ≪! DOCTYPE tvers av domener-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"><cross-domain-policy><site-control tillates-tvers av domener-politikk = "none" /> < /cross-domain-politikk >
Denne bestemt politikk filen tillater ingen tilgang til http://spreadsheets.google.com/domene for eksterne Flash-applikasjoner . Og ganske riktig, hvis du prøver å sende inn et skjema programma fra Flash, det vil mislykkes.
Dette er et perfekt eksempel der en proxy kan hjelpe
Trinn 2:. Lag en GAE Application
Registrer deg for en App Engine konto. Du vil bli bedt om å opprette en ny søknad. Her har jeg laget et program som heter activetutsproxydemo. Du blir nødt til å velge din egen unike programnavnet
Trinn 3:. Få GAE SDK
Last ned og installer App Engine SDK. Dette vil installere et program som heter Google App Engine Launcher. Kjøre den og velg Fil | Opprett ny søknad ...
Skriv inn navnet på programmet du opprettet i trinn 1, velg en plassering for programmets filer som skal lagres, og klikk på Opprett-knappen.
Trinn 4: Endre main.py File
Google App Engine Launcher vil skape et standardprogram for deg i katalogen du har angitt. Du skal se en fil som heter main.py. Overskrive innholdet i denne filen med følgende Python-kode:
fra google.appengine.ext import webappfrom google.appengine.ext.webapp.util importere run_wsgi_appimport urllibfrom google.appengine.api import urlfetchclass GoogleForm (webapp.RequestHandler): def post (egen-): destinationURL = "http://spreadsheets.google.com/formResponse?formkey=dHh4VTRVbGtSM3ZycUtpbEFKSUJ2Znc6MA&ifq~~number=plural" 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')," undersider ":" 0 "," backupCache ":" "," send ":" Send "} form_data = urllib.urlencode ( form_fields) resultat = urlfetch.fetch (url = destinationURL, nyttelast = form_data, method = urlfetch.POST, headers = {'Content-Type': 'application /x-www-form urlencoded'}) ut resultclass CrossDomain (webapp. RequestHandler): def får (egen-): «< xml version ="? self.response.headers [Content-Type '] =' text /xml 'self.response.out.write ("" 1.0 "> < tvers av domener-politikk > < allow-access-fra domenet = "*" /> < /cross-domain-politikk > "" ") søknad = webapp.WSGIApplication ([('/googleform', GoogleForm), ('/crossdomain.xml', CrossDomain)], debug = True) def main (): run_wsgi_app (program) hvis __name__ == "__main__". main ()
Du kan finne mer informasjon om hvordan denne koden fungerer i dokumentasjonen GAE, men jeg vil fremheve de viktige bitene her
Dette linje sier at GoogleForm klassen vil bli utført når http://youapplicationname.appspot.com/googleform adresse er tilgjengelig, og CrossDomain klassen vil bli utført når http://youapplicationname.appspot.com/crossdomain.xml adresse er nås.
søknad = webapp.WSGIApplication ([('/googleform', GoogleForm), ('/crossdomain.xml', CrossDomain)], debug = True)
CrossDomain klassen vil produksjonen på et innlegg domenepolicyfilen som gir full tilgang til domenet ved fjern Flash-applikasjoner
klasse CrossDomain (webapp.RequestHandler). def får (egen-): self.response.headers [Content-Type '] =' text /xml 'self.response .out.write ("" "<? xml version =" 1.0 "> < tvers av domener-politikk > < allow-access-fra domenet = "*" /> < /cross-domain-politikk > "" ")
GoogleForm klassen brukes til å passere den innkommende HTTP POST-forespørsel til Google Docs Form
klasse GoogleForm (webapp.RequestHandler). def poste (egen-) :
destinationURL variabelen definerer URL at formen vil legge til (nei, dette er ikke det samme som adressen for å vise form, men heller URL tildelt form tag handling egenskap
destinationURL =. "http://spreadsheets.google.com/formResponse?formkey=dHh4VTRVbGtSM3ZycUtpbEFKSUJ2Znc6MA&ifq"
The form_fields variabel kartlegger innkommende HTTP POST variabler med de som trenger å bli levert til Google skjemaet
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. Singelen ": self.request.get ('entry.3.single')," undersider ":" 0 "," backupCache ":" "," send ":" Send "}
Dataene i feltene er URL-kodet. Dette er litt overflødig, fordi de skal allerede være kodet av Flash-applikasjonen når de blir sendt, men det skader ikke å være sikker.
form_data = urllib.urlencode (form_fields)
Data er så re-postet til Google-servere, og resultatet blir lagret i resultatvariabelen.
resultat = urlfetch.fetch (url = destinationURL, nyttelast = form_data, method = urlfetch.POST, headers = {'Content-Type ':' application /x-www-form urlencoded '})
Resultatet blir deretter skrevet ut, noe som har effekt av å sende den tilbake til Flash-applikasjonen
utskriften
Trinn 5. .:. Last Application
Velg GAE programmet i Google App Engine Launcher og klikk på Deploy knappen
Du vil bedt om Google-IDen, og deretter programmet vil bli lastet opp
Trinn 6: Test din søknad
Gå til http://yourapplicationname.appspot.com/crossdomain.xml (du kan se min crossdomain.xml fil her). Hvis alt gikk bra, skal du se en XML-fil (du må kanskje se siden kilden for å se politikken fil).
Hvis du ser noe som ligner på bildet ovenfor, er din GAE webapplikasjon opp og kjører
Trinn 7:. Tilgang til Form med Flex
MXML filen nedenfor er et eksempel på hvordan du gjør en HTTP POST handlingen med HTTPService klassen. ?
< xml version = "1.0" encoding = "UTF-8" > < mx:? Søknad xmlns: mx = "http://www.adobe.com/2006/mxml" layout = "absolutte "width =" 550 "height =" 400 "applicationComplete =" onAppComplete () "> < mx: Script > <! [CDATA [import mx.rpc.events.FaultEvent; import mx.controls.Alert; import mx.rpc.events.ResultEvent; import mx.rpc.http.HTTPService; privat funksjon onAppComplete (): void {var variabler: Object = new Object (); variabler ["entry.0.single"] = "test0"; variabler ["entry.1.single"] = "test1"; variabler ["entry.2.single"] = "test2"; variabler ["entry.3.single"] = "test3"; Var tjeneste: HTTPService = new HTTPService (); service.url = "http://spreadsheets.google.com/formResponse?formkey=dHh4VTRVbGtSM3ZycUtpbEFKSUJ2Znc6MA&ifq"; service.resultFormat = HTTPService.RESULT_FORMAT_TEXT; service.method = "POST"; service.addEventListener (ResultEvent.RESULT, funksjon (hendelse: ResultEvent): void {Alert.show ("Data ble sendt!");}); service.addEventListener (FaultEvent.FAULT, funksjon (hendelse: FaultEvent): void {Alert.show ("Det oppsto en feil!");}); service.send (variabler); }]] ≫ < /mx: Script > < /mx: Application >
De variable variable kartene thePOST variabelnavn til data som blir sendt
Var variabler. Object = new Object (); variabler ["entry. 0.single "] =" test0 "; variabler [" entry.1.single "] =" test1 "; variabler [" entry.2.single "] =" test2 "; variabler [" entry.3.single "] = "test3";
Neste skaper vi en ny forekomst av HTTPService klassen
Var tjeneste. HTTPService = new HTTPService ();
Vi må spesifisere hvilke URL vil vi legge ut til. For denne første testen vil vi prøve å legge inn på Google skjemaet direkte. Dette vil faktisk mislykkes, men det er en god demonstrasjon av hvorfor vi trenger å bruke en proxy i første omgang.
Service.url = "http://spreadsheets.google.com/formResponse?formkey=dHh4VTRVbGtSM3ZycUtpbEFKSUJ2Znc6MA&ifq";
We fortelle HTTPService objekt som vi forventer ren tekst som svar
service.resultFormat = HTTPService.RESULT_FORMAT_TEXT;.
Vi må også fortelle HTTPService objekt som vi ønsker å utføre en HTTP POST operasjon
service.. method = "POST";
Noen hendingsaktivatorar er satt opp for å gi oss beskjed om operasjonen var vellykket eller ikke
service.addEventListener (ResultEvent.RESULT, funksjon (hendelse: ResultEvent): void {Alert.show. ("Data ble sendt!");}); service.addEventListener (FaultEvent.FAULT, funksjon (hendelse: FaultEvent): void {Alert.show ("Det oppsto en feil!");});
Til slutt Vi sender data av
service.send (variabler);
Trinn 8:. kompilere programmet
Hvis du kompilere og kjøre programmet med knappen med den grønne pilen på det, vil du oppdage at det faktisk fungerer.
Så hva er big deal? Hvorfor gå til alt bryet med å lage en proxy? Vel, vil programmet fungere på din lokale maskin fordi /bin-debug /katalogen der Flex plasserer kompilert SWF er en klarert plassering. Dette betyr at programmet vil være i stand til å få tilgang til Google-serveren. For å simulere hvordan programmet ville fungere på en nettside om du trenger å kompilere et versjonen.
Nå, når du kjører SWF fra /bin-release /mappe, vil du se at operasjonen mislyktes . Dette er hvordan SWF vil fungere når den er lastet opp til en nettside
Trinn 9:. Bruke Proxy
Bruke GAE proxy er en enkel Ved å endre URL-adressen som er tildelt den HTTPService objektet.
service.url = "http://activetutsproxydemo.appspot.com/googleform";
Now når du kjører programmet, enten fra bin-debug eller bin-release kataloger, vil operasjonen fullføres.
Konklusjon
Opprette en Google App Engine proxy program vil tillate deg å enkelt få tilgang til ressurser på servere som ellers ville utelukke Flash-applikasjoner . Så lenge din søknad ikke ber om massive ressurser bør du finner ut at du ikke vil krysse grensene for det frie GAE service.
Men, ikke bli fristet til å skape en mer generell fullmakt. Selv om det ville være mulig å lage en proxy som brukte en spesiell variabel for å avgjøre destinasjonsadressen, noe som gjør programmet i stand til å opptre som fullmektig for en ressurs, ville en slik server raskt utnyttet av andre utviklere. Her har vi hard kodet målet url, noe som betyr at i verste fall noen kunne bruke denne proxy for å overføre data til Google Docs form. Dette gjør det til liten nytte for noen andre, og reduserer sannsynligheten for at tjenesten vil bli misbrukt.
Jeg håper du likte denne opplæringen, takk for lesing!