Consejo rápido uso de Google App Engine como un servidor proxy

Google App Engine se puede utilizar como una forma gratuita y conveniente para evitar los archivos de políticas cruzadas de dominio restrictivos o faltantes. Este tutorial le mostrará cómo crear un proxy GAE que proporciona acceso a recursos restringidos para su aplicación Flash.


Vista previa del resultado final

Echemos un vistazo al resultado final en el que trabajaremos:

Eso acaba de enviar algunos datos de prueba a una hoja de cálculo remota alojada en Google Docs. Esto no funcionaría sin un archivo crossdomain.xml en el dominio de recepción. Sin embargo, el archivo de política de dominios cruzados en Google Docs no permite esto, y no puedo cambiarlo. Sigue leyendo para saber cómo se hizo esto..


Por qué usar un proxy?

En mi último Consejo rápido, una guía para los archivos de políticas de dominios cruzados, le mostré cómo utiliza Flash los archivos de políticas de dominios cruzados para determinar a qué datos se puede acceder desde dominios remotos. Si bien la capacidad de controlar el acceso a los recursos es excelente para los administradores, es un dolor para los desarrolladores de Flash que intentan acceder a los datos en un servidor que no tiene un archivo de políticas de varios dominios, ya que ningún archivo de políticas significa que no hay acceso. La configuración de un archivo de políticas de dominio cruzado se puede pasar por alto fácilmente, y me he topado con más de un proveedor de servicios web que no pensaba atender a los desarrolladores de Flash.

También mencioné que el problema fue fácilmente evitado por el uso de un proxy. La idea detrás de un proxy es que aceptará conexiones desde aplicaciones Flash remotas (al proporcionar el archivo crossdomain.xml apropiado), y luego actuar como intermediario que pasa datos de un lado a otro. El único requisito real de un servidor proxy (en relación con Flash) es que debe poder acceder a los recursos públicos independientemente de los permisos que una política de varios dominios pueda otorgar o no..

La buena noticia es que puede configurar un proxy de este tipo sin costos iniciales utilizando Google App Engine (GAE). GAE hospedará una aplicación web, y suponiendo que sus requisitos de tráfico están por debajo de su umbral, no hay ningún cargo. Lo que demostraré aquí es cómo crear una aplicación web GAE simple que pueda actuar como un proxy, permitiendo a las aplicaciones Flash acceder a recursos que de otro modo estarían fuera de los límites..


Paso 1: Hojas de cálculo de Google y el temido crossdomain.xml

Hay una característica realmente interesante en Google Docs que le permite crear un formulario web que se puede utilizar para rellenar una hoja de cálculo. He configurado tal formulario aquí, y los resultados de este formulario se publican como una página web pública aquí. El formulario es un formulario HTML estándar, que se puede enviar mediante programación utilizando una operación HTTP POST estándar.

Recientemente estuve en una posición en la que necesitaba recopilar algunos comentarios de una aplicación Flash que había distribuido. Estas formas parecían ser una gran manera de hacer eso. No había costos de alojamiento para mí, los resultados podían analizarse fácilmente directamente por la hoja de cálculo, y podía estar bastante seguro de que un servicio de Google como Docs sería confiable. El único problema fue la política de dominios cruzados.

    

Este archivo de política en particular no permite el acceso al http://spreadsheets.google.com/dominio para aplicaciones Flash remotas. Y por supuesto, si intenta enviar un formulario desde Flash mediante programación, se producirá un error..

Este es un ejemplo perfecto donde un proxy puede ayudar.


Paso 2: Crear una aplicación GAE

Regístrese para obtener una cuenta de App Engine. Se le pedirá que cree una nueva aplicación. Aquí he creado una aplicación llamada activetutsproxydemo. Tendrás que elegir tu propio nombre de aplicación único.


Paso 3: Obtén el SDK de GAE

Descarga e instala el SDK de App Engine. Esto instalará una aplicación llamada Google App Engine Launcher. Ejecutalo y haz click Archivo | Crear nueva aplicación ...

Escriba el nombre de la aplicación que creó en el Paso 1, seleccione una ubicación para almacenar los archivos de la aplicación y haga clic en Crear botón.


Paso 4: Modificar el archivo main.py

Google App Engine Launcher creará una aplicación predeterminada para usted en el directorio que especificó. Debería ver un archivo llamado main.py. Sobrescriba el contenido de este archivo con el siguiente código de Python:

 from google.appengine.ext importar webapp desde google.appengine.ext.webapp.util importar run_wsgi_app importar urllib desde google.appengine.api importar urlfetch clase 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, método = urlfetch.POST, encabezados = 'Content-Type': 'application / x-www-form-urlencoded') imprimir la clase de resultado CrossDomain (webapp.RequestHandler): def get (self): self.response .headers ['Content-Type'] = 'text / xml' self.response.out.write ("" "   "" ") application = webapp.WSGIApplication ([('' / googleform ', GoogleForm), (' /crossdomain.xml ', CrossDomain)], debug = True) def main (): run_wsgi_app (application) if __name__ ==" __Principal Principal()

Puede encontrar más información sobre cómo funciona este código en la documentación de GAE, pero resaltaré los puntos importantes aquí.

Esta línea dice que la GoogleForm clase se ejecutará cuando se acceda a la http://youapplicationname.appspot.com/googleform address, y la Dominio cruzado la clase se ejecutará cuando se acceda a la dirección http://youapplicationname.appspot.com/crossdomain.xml.

application = webapp.WSGIApplication ([('' / googleform ', GoogleForm), (' /crossdomain.xml ', CrossDomain)], debug = True)

los Dominio cruzado La clase generará un archivo de políticas de dominio cruzado que permite el acceso completo al dominio mediante aplicaciones Flash remotas.

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

los GoogleForm clase se utiliza para pasar la solicitud HTTP POST entrante al formulario de Google Docs.

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

los URL de destino variable define la URL en la que se publicará el formulario (no, no es la misma que la URL utilizada para ver el formulario, sino la URL asignada a la URL). formar etiqueta acción atributo.

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

los form_fields la variable asigna las variables POST de HTTP entrantes con las que se deben proporcionar al formulario de Google.

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 "

Los datos en los campos están codificados en URL. Esto es un poco redundante, porque ya deberían estar codificados por la aplicación Flash cuando se envían, pero no está mal asegurarse de que.

form_data = urllib.urlencode (form_fields)

Los datos se vuelven a publicar en los servidores de Google y el resultado se guarda en el resultado variable.

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

El resultado se imprime, lo que tiene el efecto de enviarlo de vuelta a la aplicación Flash..

resultado de impresión

Paso 5: Subir la aplicación

Seleccione su aplicación GAE en el iniciador de Google App Engine y haga clic en el botón Implementar.

Se le solicitarán sus credenciales de Google y, a continuación, se cargará la aplicación..


Paso 6: Pruebe su aplicación

Vaya a http://yourapplicationname.appspot.com/crossdomain.xml (puede ver mi archivo crossdomain.xml aquí). Si todo salió bien, debería ver un archivo XML (es posible que deba ver la fuente de la página para ver el archivo de políticas).

Si ve algo similar a la imagen de arriba, su aplicación web GAE está funcionando.


Paso 7: Accediendo al formulario con Flex

El archivo MXML a continuación es un ejemplo de cómo realizar una acción POST de HTTP usando el HTTPService clase.

     

los variables la variable asigna los nombres de las variables POST a los datos que se enviarán.

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

A continuación creamos una nueva instancia del HTTPService clase.

var service: HTTPService = new HTTPService ();

Necesitamos especificar a qué URL enviaremos. Para esta primera prueba, intentaremos enviar directamente al formulario de Google. Esto realmente fallará, pero es una buena demostración de por qué necesitamos usar un proxy en primer lugar.

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

Le decimos al HTTPService objeto que estamos esperando texto sin formato en respuesta.

service.resultFormat = HTTPService.RESULT_FORMAT_TEXT;

También necesitamos decirle al HTTPService Objeto que queremos realizar una operación HTTP POST..

service.method = "POST";

Algunos manejadores de eventos están configurados para avisarnos si la operación fue exitosa o no.

service.addEventListener (ResultEvent.RESULT, function (event: ResultEvent): void Alert.show ("¡Los datos se enviaron correctamente!");); service.addEventListener (FaultEvent.FAULT, function (event: FaultEvent): void Alert.show ("¡Hubo un error!"););

Finalmente, enviamos los datos fuera.

service.send (variables);

Paso 8: Compilar la aplicación

Si compila y ejecuta la aplicación usando el botón con la flecha verde en ella, encontrará que realmente funciona.

Entonces, ¿cuál es el problema? ¿Por qué tomarse la molestia de crear un proxy? Bueno, la aplicación funcionará en su máquina local porque el directorio / bin-debug / donde Flex coloca el SWF compilado es una ubicación confiable. Esto significa que la aplicación podrá acceder al servidor de Google. Para simular cómo funcionaría la aplicación en un sitio web, es necesario compilar una versión de lanzamiento..

Ahora, cuando ejecute el archivo SWF desde la carpeta / bin-release /, verá que la operación ha fallado. Así es como actuará el SWF cuando se cargue en un sitio web.


Paso 9: Usando el Proxy

El uso del proxy GAE es un caso simple de cambiar la URL asignada a la HTTPService objeto.

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

Ahora, cuando ejecute la aplicación, ya sea desde los directorios bin-debug o bin-release, la operación se completará con éxito.


Conclusión

La creación de una aplicación proxy de Google App Engine le permitirá acceder fácilmente a los recursos en servidores que, de lo contrario, excluirían las aplicaciones Flash. Siempre que su aplicación no esté solicitando recursos masivos, debe encontrar que no cruzará los umbrales para el servicio GAE gratuito..

Sin embargo, no tengas la tentación de crear un proxy más generalizado. Si bien sería posible crear un proxy que utilizara una variable especial para determinar la URL de destino, haciendo que la aplicación sea capaz de actuar como un proxy para cualquier recurso, este servidor sería explotado rápidamente por otros desarrolladores. Aquí hemos codificado la URL de destino, lo que significa que, en el peor de los casos, alguien podría usar este proxy para pasar datos al formulario de Google Docs. Esto hace que sea de poca utilidad para cualquier otra persona, y reduce la probabilidad de que se abuse del servicio..

Espero que te haya gustado este tutorial, gracias por leerlo.!