RemotingService | params

3 views
Skip to first unread message

thomas

unread,
Jun 8, 2009, 3:34:05 AM6/8/09
to veg...@googlegroups.com
Bonjour à tous,


Je suis en train de faire quelques essais de remoting et amfphp (avec
asguard.net.remoting) et j'ai quelques questions:

- Comment passer un Array() avec la methode [params] de RemotingService
? Qu'en je lui passe, il concatène tout. En vérifiant directement dans
la classe, tout s'explique mais je ne vois pas de moyen d'empêcher cela.

- Je développe une application qui devra pouvoir être "embarquée" (comme
les player de Youtube), comment sécuriser l'accès à AMFphp et à mes
requêtes ? Cryptage ? ?


Merci d'avance pour vos conseils,

thomas


ekameleon

unread,
Jun 8, 2009, 3:41:42 AM6/8/09
to veg...@googlegroups.com
Hello :)

Montre moi un peu de code pour voir ce que tu fais (juste l'essentiel)

En principe pour passer un Array suffit de faire :

service.params = [ ] ;

service.run() ;

En effet si tu passes directement le Array. En effet la propriétés params est un Array des paramètres donc faut faire gaffe si tu envois un Array.

Sinon tu peux aussi juste taper :

service.run(  [ 2, 3, 4 ] ) ;

Mais si tu fais bien ce que je dis au dessus je ferais des tests.

Dans tous les cas pour des envois vers un serveur je préfère pour ma part envoyer des objets génériques qui sont donc transformés en PHP en Array indexé.

Si tu continues à avoir un soucis avec ton Array montre moi ton code et je verrais si je dois fixer mon code ou pas ? :)

Pour sécuriser AMFPHP :

1 - utilise les authentifications de AMFPHP avec les credentials :


Avec dans ton PHP :


2 - utilise du cryptage oui avec TEA, XTEA , SHA1 etc... 

EKA+ :)

thomas

unread,
Jun 8, 2009, 4:22:02 AM6/8/09
to veg...@googlegroups.com
Effectivement en faisant gaffe ça va toujours mieux.

Dans l'exemple "remoting01.fla" tu fais:
*service.params = [ "world" + cpt++ ]*

Du coup sans trop faire gaffe, j'ai passé plusieurs objets comme ça:
*service.params [ [] + [] ]*

Donc:
*service.params[ Array ] //va très bien.
**service.params[ Array , Array2 ] //va aussi très bien.*
*
*
Une fois de plus, l'erreur venait de moi. Pouark, le boulet ! Pourtant
cette fois, j'avais attendu le matin pour écrire ;-)
Cependant, une petite question, si tu choisis de passer des objets
génériques, est-ce uniquement une question de lisibilité de code ?

Merci de ta réponse et pour les liens pour la sécurisation. Super !

ekameleon a écrit :


> Hello :)
>
> Montre moi un peu de code pour voir ce que tu fais (juste l'essentiel)
>
> En principe pour passer un Array suffit de faire :
>
> service.params = [ ] ;
>
> service.run() ;
>
> En effet si tu passes directement le Array. En effet la propriétés
> params est un Array des paramètres donc faut faire gaffe si tu envois
> un Array.
>
> Sinon tu peux aussi juste taper :
>
> service.run( [ 2, 3, 4 ] ) ;
>
> Mais si tu fais bien ce que je dis au dessus je ferais des tests.
>
> Dans tous les cas pour des envois vers un serveur je préfère pour ma
> part envoyer des objets génériques qui sont donc transformés en PHP en
> Array indexé.
>
> Si tu continues à avoir un soucis avec ton Array montre moi ton code
> et je verrais si je dois fixer mon code ou pas ? :)
>
> Pour sécuriser AMFPHP :
>
> 1 - utilise les authentifications de AMFPHP avec les credentials :
>
> http://code.google.com/p/as-gard/source/browse/trunk/AS3/trunk/examples/asgard/net/remoting/trunk/examples/ExampleRemoting03.as
>
> Avec dans ton PHP :
>
> http://code.google.com/p/as-gard/source/browse/trunk/AS3/trunk/examples/asgard/net/remoting/trunk/deploy/php/services/TestAuthentificate.php
>
> 2 - utilise du cryptage oui avec TEA, XTEA , SHA1 etc...
>
> EKA+ :)
>
>
> Le 8 juin 2009 09:34, thomas <ths....@gmail.com

> <mailto:ths....@gmail.com>> a écrit :

Matthieu

unread,
Jun 8, 2009, 4:22:30 AM6/8/09
to veg...@googlegroups.com
Salut,

De mon côté, j'utilise AMFPHP avec Vegas, je transmet des Array ou des objets, il n'y a aucun problème.

Exemple de flash vers php :
var aContent : Array = new Array();
aContent["mailto"] = oTxtMailFriend.getOnlyText();
aContent["nameto"] = oTxtNameFriend.getOnlyText();
var service:RemotingService = factory.getObject("get_challenge_service") as RemotingService ;
if ( service != null ) service.run(aContent) ;

En php tu récupère un array classique :
$
aContent["mailto"] ....

Exemple de php vers flash :
$aResult = array();
$aResult["session"] = $oSessionS->generateSid();   
$aResult["date"] = $nTimestamp;
return $aResult;

Récupération côté flash sous forme d'un objet :
public override function result( e:RemotingEvent ):void
{   
            var result:* = e.getResult() ;
            if (result == null)    logger.warn( this + " run failed with an empty result.") ;
            else if ( result is Object )
            {
                var aResult : Object = result as Object;
                //getLogger().debug( this + " session : "+aResult.session) ;
                //getLogger().debug( this + " date : "+aResult.date) ;
            }
}


Pour ces cryptages ci dessus, je crois que les classes vegas n'étaient pas finalisées en AS3 lorsque j'avais testé ?
Il faut crypter en
SHA1 en AS3 et décrypter le SHA1 en php.
Merci EKA pour ces précisions, je vais regarder cela pour sécuriser mes communication en remoting sur le point 1.

@++

Matthieu

www.delfiweb.com

ekameleon a écrit :
--

Observez, Partagez, Réagissez sur www.InfosLibres.fr
RSS : S'abonner au flux RSS http://www.infoslibres.fr/feed/
Newsletter : Recevoir les articles par email http://www.infoslibres.fr/phpmynewsletter/index.php

ekameleon

unread,
Jun 8, 2009, 4:49:17 AM6/8/09
to veg...@googlegroups.com
Hello :)

@Thomas

Oui pour le moment en Ruby tu peux utiliser l'opérateur + pour concaténer les Array (super) mais en AS3 c'est pas encore possible, j'espère qu'en AS4 on aura la possibilité de définir les opérateurs comme c'était prévu en ES4 avant le grand chambardement de l'ES5 aka ES3.1 de Microsoft.. :(

Sinon pour le coup de l'objet générique... je vais un peu plus loin que cela ;)

En fait dans mon application souvent j'ai des value objects (simple classe pour gérer les données que l'on veut transférer entre un client et un serveur), exemple :

package
{
    public class UserVO 
    {
        public function UserVO( name:String )
        {
             this.name = name ;
        }
        public var name:String ;
    }
}

Donc pour le class mapping entre server et client c'est le top avec un registerClassByAlias, sinon dans l'autre sens client vers serveur AMFPHP fonctionne pas bien en class mapping du coup dans tous mes values object j'ajoute une méthode toObject() qui renvoi une version "objet générique" de mon objet :

package
{
    public class UserVO 
    {
        public function UserVO( name:String )
        {
             this.name = name ;
        }
        public var name:String ;

        public function toObject()
        {
             return { name  : name } ;
        }
    }
}

Du coup dans mes services je lance la méthode avec un paramètre typé et son toObject():

service.run( user.toObject() ) ;

du coup je peux sécuriser ce que j'envois vers le serveur dans la méthode toObject() et il est beaucoup plus simple du coup de tester (unit test) ce que j'envois vers le serveur.

A noter avec VEGAS et eden qu'il est pratique d'utiliser eden pour voir le contenu de ce que l'on envoi vers le serveur en tapant :

trace( eden.serialize( user.toObject() ) ;

EKA+ :)

ekameleon

unread,
Jun 8, 2009, 4:53:35 AM6/8/09
to veg...@googlegroups.com
Hello :)

@Mathieu

PS : je continue vraiment à pas aimer ton usage abusif des notations hongroises pour toutes tes variables :

- aResult:Object : ici tu veux un Array ou un Object ? le mieux reste tout de même une notation * et surtout un nom "result" sera plus explicite dans la lecture du code

Sinon dans ton flash tu écris :

var aContent : Array = new Array();
aContent["mailto"] = oTxtMailFriend.getOnlyText();
aContent["nameto"] = oTxtNameFriend.getOnlyText();

Franchement vaut mieux que tu utilises un objet simple :

var content:Object = 
{
    mailto   : mailField.text  || "" ,
    nameto : nameField.text || "" 
}

Si tu utilises un Array avec des index String en Flash tu fais une grosse erreur... les Objets sont justement là pour éviter le code que tu tapes au dessus ;)

Sinon dans le sens PHP vers Flash je te conseille vivement le classmapping plus rapide et plus propre ;) Voir mon exemple de class mapping dans Ast'r eGallery advanced ou sur mon blog en cherchant un peu ;)

EKA+ :)

thomas

unread,
Jun 8, 2009, 5:00:24 AM6/8/09
to veg...@googlegroups.com
Vos réponses sont super intéressantes... merci ! Je vais essayer tout ça
tranquillement ... et je vous rembête plus tard !

Du coup, j'en profite pour dire (ça pourrait servir à d'autres
débutants) que l'utilisation d'un framework est super même pour un
débutant, on apprend beaucoup de choses qui ne figureraient pas dans des
codes dédiés. Je regrette pas !

bonne journée !


ekameleon a écrit :
> Hello :)
>

> @Thomas
>
> Oui pour le moment en Ruby tu peux utiliser l'opérateur + pour
> concaténer les Array (super) mais en AS3 c'est pas encore possible,
> j'espère qu'en AS4 on aura la possibilité de définir les opérateurs
> comme c'était prévu en ES4 avant le grand chambardement de l'ES5 aka
> ES3.1 de Microsoft.. :(
>
> Sinon pour le coup de l'objet générique... je vais un peu plus loin
> que cela ;)
>
> En fait dans mon application souvent j'ai des value objects (simple
> classe pour gérer les données que l'on veut transférer entre un client
> et un serveur), exemple :
>
> package
> {
> public class UserVO
> {
> public function UserVO( name:String )
> {

> this.name <http://this.name> = name ;


> }
> public var name:String ;
> }
> }
>
> Donc pour le class mapping entre server et client c'est le top avec un
> registerClassByAlias, sinon dans l'autre sens client vers serveur
> AMFPHP fonctionne pas bien en class mapping du coup dans tous mes
> values object j'ajoute une méthode toObject() qui renvoi une version
> "objet générique" de mon objet :
>
> package
> {
> public class UserVO
> {
> public function UserVO( name:String )
> {

> this.name <http://this.name> = name ;


> }
> public var name:String ;
>
> public function toObject()
> {
> return { name : name } ;
> }
> }
> }
>
> Du coup dans mes services je lance la méthode avec un paramètre typé
> et son toObject():
>
> service.run( user.toObject() ) ;
>
> du coup je peux sécuriser ce que j'envois vers le serveur dans la
> méthode toObject() et il est beaucoup plus simple du coup de tester
> (unit test) ce que j'envois vers le serveur.
>
> A noter avec VEGAS et eden qu'il est pratique d'utiliser eden pour
> voir le contenu de ce que l'on envoi vers le serveur en tapant :
>
> trace( eden.serialize( user.toObject() ) ;
>
> EKA+ :)
>
> Le 8 juin 2009 10:22, thomas <ths....@gmail.com

> <mailto:ths....@gmail.com>> a écrit :

> <mailto:ths....@gmail.com> <mailto:ths....@gmail.com

ekameleon

unread,
Jun 8, 2009, 5:06:32 AM6/8/09
to veg...@googlegroups.com
Hello :)

C'est clair :) Le meilleur apprentissage se fait en lisant du code, mieux qu'un livre si le code est pas trop mauvais ;) En plus le mieux c'est la démarche que vous avez au dessus en participant et en osant poser des questions pour mieux comprendre.

EKA+ :)
Reply all
Reply to author
Forward
0 new messages