Astuce utiliser Google App Engine en tant que serveur proxy

Google App Engine peut être utilisé comme un moyen gratuit et pratique de gérer les fichiers de règles restrictifs ou manquants entre domaines. Ce tutoriel vous montrera comment créer un proxy GAE donnant accès à des ressources limitées pour votre application Flash..


Aperçu du résultat final

Jetons un coup d'œil au résultat final sur lequel nous allons travailler:

Cela vient d'envoyer des données de test à une feuille de calcul distante hébergée sur Google Docs. Cela ne fonctionnerait pas sans un fichier crossdomain.xml sur le domaine de destination. Toutefois, le fichier de stratégie inter-domaines de Google Documents ne le permet pas et je ne peux pas le modifier. Lisez la suite pour savoir comment cela a été fait.


Pourquoi utiliser un proxy?

Dans ma dernière astuce rapide intitulée Guide des fichiers de stratégie inter-domaines, je vous ai montré comment Flash utilise les fichiers de stratégie inter-domaines pour déterminer les données accessibles à partir de domaines distants. Bien que pouvoir contrôler l’accès aux ressources soit avantageux pour les administrateurs, c’est un problème pour les développeurs Flash qui tentent d’accéder aux données sur un serveur ne disposant pas de fichier de stratégie interdomaine, car aucun fichier de stratégie ne signifie aucun accès. La configuration d'un fichier de stratégie inter-domaines peut facilement être négligée, et j'ai rencontré plus d'un fournisseur de services Web qui ne pensait pas prendre en charge les développeurs Flash..

J'ai également mentionné que le problème était facilement contourné par l'utilisation d'un proxy. L'idée derrière un proxy est qu'il acceptera les connexions à partir d'applications Flash distantes (en fournissant le fichier crossdomain.xml approprié), puis agira comme un intermédiaire en passant de données en arrière. La seule exigence réelle d'un serveur proxy (en ce qui concerne Flash) est qu'il doit pouvoir accéder aux ressources publiques, quelles que soient les autorisations accordées ou non par une stratégie interdomaine..

La très bonne nouvelle est que vous pouvez configurer un tel proxy sans aucun coût initial avec Google App Engine (GAE). GAE hébergera une application Web et si vos besoins de trafic sont inférieurs à leur seuil, aucun frais ne vous sera facturé. Ce que je vais démontrer ici est comment créer une application Web GAE simple pouvant servir de proxy, permettant aux applications Flash d’accéder à des ressources qui seraient autrement inaccessibles..


Étape 1: Google Tableur et le redoutable crossdomain.xml

Il existe une fonctionnalité très intéressante dans Google Documents qui vous permet de créer un formulaire Web qui peut être utilisé pour remplir une feuille de calcul. J'ai mis en place un tel formulaire ici, avec les résultats de ce formulaire publié ici en tant que page Web publique. Le formulaire est un formulaire HTML standard, qui peut être soumis par programme à l'aide d'une opération HTTP POST standard..

J'étais récemment dans une position où je devais recueillir des commentaires d'une application Flash que j'avais distribuée. Ces formes semblaient être un excellent moyen de le faire. Il n'y avait aucun coût d'hébergement pour moi, les résultats pouvaient être facilement analysés directement par le tableur et je pouvais être presque sûr qu'un service de Google comme Docs serait fiable. Le seul problème était la politique interdomaine.

    

Ce fichier de stratégie particulier ne permet pas d'accéder au domaine http://spreadsheets.google.com/ pour les applications Flash distantes. Et bien sûr, si vous essayez de soumettre un formulaire par programme à partir de Flash, il échouera..

Ceci est un exemple parfait où un proxy peut aider.


Étape 2: Créer une application GAE

Inscrivez-vous pour un compte App Engine. Vous serez invité à créer une nouvelle application. Ici, j'ai créé une application appelée activetutsproxydemo. Vous devrez choisir votre propre nom d'application.


Étape 3: Obtenez le SDK GAE

Téléchargez et installez le kit de développement logiciel App Engine. Cela installera une application appelée Google App Engine Launcher. Exécutez-le et cliquez Fichier | Créer une nouvelle application…

Saisissez le nom de l'application créée à l'étape 1, sélectionnez un emplacement pour le stockage des fichiers de l'application, puis cliquez sur l'icône. Créer bouton.


Étape 4: Modifier le fichier main.py

Le lanceur Google App Engine créera une application par défaut pour vous dans le répertoire que vous avez spécifié. Vous devriez voir un fichier appelé main.py. Remplacez le contenu de ce fichier par le code Python suivant:

 à partir de google.appengine.ext import Webapp à partir de google.appengine.ext.webapp.util import run_wsgi_app import urllib à partir de google.appengine.api import urlfetch class GoogleForm (webapp.RequestHandler): def poste /spreadsheets.google.com/formResponse?formkey=dHh4VTRVbGtSM3ZycUtpbEFKSUJ2Znc6MA&ifq "form_fields = " entry.0.single ": self.request.get ('entry.0.single')," entry.1.single "," entry.0.single "," entry.1.single ". .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, method = urlfetch.POST, en-têtes = 'Content-Type': 'application / x-www-form-urlencoded') imprimer la classe de résultat 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) si __name__ ==" __main__ ": main ()

Vous trouverez plus d'informations sur le fonctionnement de ce code dans la documentation GAE, mais je soulignerai les éléments importants ici..

Cette ligne dit que le GoogleForm La classe sera exécutée lors de l'accès à l'adresse http://youapplicationname.appspot.com/googleform, et le CrossDomain La classe sera exécutée lors de l'accès à l'adresse http://youapplicationname.appspot.com/crossdomain.xml..

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

le CrossDomain La classe produira un fichier de stratégie interdomaine permettant un accès complet au domaine par les applications Flash distantes..

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

le GoogleForm La classe est utilisée pour transmettre la demande HTTP POST entrante au formulaire Google Docs..

classe GoogleForm (webapp.RequestHandler): def post (auto):

le URL de destination variable définit l'URL à laquelle le formulaire sera envoyé (non, il ne s'agit pas de l'URL utilisée pour afficher le formulaire, mais plutôt de l'URL attribuée à l'élément forme Mots clés action attribut.

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

le formulaire_fichiers variable mappe les variables HTTP POST entrantes avec celles qui doivent être fournies au formulaire 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 "

Les données dans les champs sont encodées en URL. C’est un peu redondant, car ils devraient déjà être encodés par l’application Flash lorsqu’ils sont envoyés, mais cela ne fait pas de mal de s’assurer.

form_data = urllib.urlencode (form_fields)

Les données sont ensuite re-POSTées aux serveurs de Google et le résultat est enregistré dans le répertoire. résultat variable.

result = urlfetch.fetch (url = URL de destination, payload = données_formulaire, méthode = urlfetch.POST, en-têtes = 'Type de contenu': 'application / x-www-form-urlencoded')

Le résultat est ensuite imprimé, ce qui a pour effet de le renvoyer à l'application Flash..

résultat d'impression

Étape 5: Téléchargez l'application

Sélectionnez votre application GAE dans le lanceur Google App Engine et cliquez sur le bouton Déployer..

Vous serez invité à entrer vos informations d'identification Google, puis l'application sera téléchargée..


Étape 6: Testez votre application

Allez à http://votreapplicationname.appspot.com/crossdomain.xml (vous pouvez voir mon fichier crossdomain.xml ici). Si tout se passe bien, vous devriez voir un fichier XML (vous devrez peut-être voir la source de la page pour voir le fichier de politique).

Si vous voyez quelque chose de similaire à l'image ci-dessus, votre application Web GAE est opérationnelle..


Étape 7: Accéder au formulaire avec Flex

Le fichier MXML ci-dessous est un exemple de la procédure à suivre pour effectuer une action HTTP POST à ​​l'aide du HTTPService classe.

     

le les variables variable mappe les noms de variable POST aux données qui seront envoyées.

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

Ensuite, nous créons une nouvelle instance du HTTPService classe.

service var: HTTPService = new HTTPService ();

Nous devons spécifier l'URL sur laquelle nous allons poster. Pour ce premier test, nous allons essayer de poster directement sur le formulaire Google. Cela échouera réellement, mais c'est une bonne démonstration de la raison pour laquelle nous devons utiliser un proxy en premier lieu.

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

Nous disons au HTTPService objet que nous attendons en texte clair en réponse.

service.resultFormat = HTTPService.RESULT_FORMAT_TEXT;

Nous devons aussi dire au HTTPService objet que nous voulons effectuer une opération HTTP POST.

service.method = "POST";

Certains gestionnaires d'événements sont configurés pour nous indiquer si l'opération a abouti ou non..

service.addEventListener (ResultEvent.RESULT, fonction (événement: ResultEvent): void Alert.show ("Les données ont été envoyées avec succès!");); service.addEventListener (FaultEvent.FAULT, fonction (événement: FaultEvent): void Alert.show ("Une erreur s'est produite!"););

Enfin, nous envoyons les données.

service.send (variables);

Étape 8: compiler l'application

Si vous compilez et exécutez l'application à l'aide du bouton avec la flèche verte dessus, vous constaterez que cela fonctionne réellement..

Alors, quel est le gros problème? Pourquoi se donner la peine de créer un proxy? Eh bien, l’application fonctionnera sur votre ordinateur local car le répertoire / bin-debug / dans lequel Flex place le fichier SWF compilé est un emplacement approuvé. Cela signifie que l'application pourra accéder au serveur Google. Pour simuler le fonctionnement de l'application sur un site Web, vous devez toutefois compiler une version..

Maintenant, lorsque vous exécutez le fichier SWF à partir du dossier / bin-release /, vous verrez que l'opération a échoué. C’est ce que fera le SWF lorsqu’il sera téléchargé sur un site Web..


Étape 9: Utilisation du proxy

L’utilisation du proxy GAE est un simple cas de modification de l’URL attribuée au HTTPService objet.

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

Maintenant, lorsque vous exécutez l'application, à partir des répertoires bin-debug ou bin-release, l'opération se termine correctement..


Conclusion

La création d’une application proxy de Google App Engine vous permettra d’accéder facilement à des ressources sur des serveurs qui excluraient les applications Flash. Tant que votre application ne demande pas d’énormes ressources, vous devez être assuré de ne pas dépasser les seuils pour le service gratuit GAE..

Cependant, ne soyez pas tenté de créer un proxy plus généralisé. S'il serait possible de créer un proxy utilisant une variable spéciale pour déterminer l'URL de destination, permettant ainsi à l'application de jouer le rôle de proxy pour n'importe quelle ressource, un tel serveur serait rapidement exploité par d'autres développeurs. Ici, nous avons codé en dur l'URL de destination, ce qui signifie qu'au pire, quelqu'un pourrait utiliser ce proxy pour transmettre des données au formulaire Google Docs. Cela le rend peu utile à quiconque et réduit les risques d'abus du service..

J'espère que vous avez aimé ce tutoriel, merci d'avoir lu!