2010-09-20 3 views
1

J'essaie de me connecter à mon application Rails via une application adobe flex qui utilise Devise mais ne parvient pas à comprendre comment mapper la requête AMF à Devise :: SessionsController # New. J'ai essayé les suivantesConnexion via Rails Devise et Adobe AMF3

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="700" minHeight="600"> 
<fx:Declarations> 
    <mx:RemoteObject id="deviseService" fault="onFault(event)" 

        source="Devise:SessionsController" destination="rubyamf"> 

     <mx:method name="new" result="onResult(event)" /> 

    </mx:RemoteObject> 

</fx:Declarations> 

<fx:Script> 
    <![CDATA[ 
     import mx.rpc.events.ResultEvent; 
     import mx.rpc.events.FaultEvent; 
     import mx.rpc.Fault; 

     private function onFault(e:FaultEvent):void 
     { 
      resultTxt.text = e.fault.faultString; 
     } 

     private function onResult(e:ResultEvent):void 
     { 
      resultTxt.text = e.message.toString(); 
     } 
    ]]> 
</fx:Script> 

<s:Panel title="Login" width="300" height="150" x="597" y="248" > 
    <s:VGroup horizontalAlign="center" paddingLeft="5" paddingRight="5"> 
     <s:HGroup paddingLeft="5" paddingRight="5">  
      <s:Label text="Username" /> 
      <s:TextInput id="username" width="100" />  
     </s:HGroup> 
     <s:HGroup > 
      <s:Label text="Password" /> 
      <s:TextInput id="password" width="100" /> 
     </s:HGroup> 
     <s:Button id="submitLogin" label="go" click="deviseService.new.send({name: username.text, password: password.text});" /> 
     <s:Label id="resultTxt" /> 
    </s:VGroup> 
</s:Panel> 

Lorsque je clique sur le bouton "go", les rails indique ce qui suit

Started POST "/rubyamf/gateway" for 127.0.0.1 at 2010-09-19 18:59:52 -0500 
Rendered devise/shared/_links.erb (1.0ms) 
Rendered devise/menu/_registration_items.html.erb (2.0ms) 
Rendered devise/menu/_login_items.html.erb (1.0ms) 
{"session_id"=>"dc95da0ed877a214ffc60eeb3f635c34", "_csrf_token"=>"9npBO2tywAK30O43rroOwMZTEC8P+kUSdjuxe2u9hxA=", "flash"=>{:alert=>"You need to sign in or sign up before continuing."}} 
Rendered devise/sessions/new.html.erb within layouts/application (40.0ms) 
Completed 200 OK in 176ms (Views: 69.0ms | ActiveRecord: 0.0ms) 
Started POST "/rubyamf/gateway" for 127.0.0.1 at 2010-09-19 18:59:53 -0500 
Sending back AMF 

Toutes les suggestions sont les bienvenus. Thanx

Répondre

2

Tout d'abord, AMF prend en charge la définition et l'envoi de données de cookies. Malheureusement, il existe plusieurs combinaisons d'anciens navigateurs et de logiciels anti-virus trop zélés qui suppriment les cookies uniquement pour le trafic AMF. Pour éviter ces problèmes, tous les appels AMF protégés de ma société nécessitent l'identifiant de session pour l'authentification. Nous utilisons ExternalInterface dans Flash pour saisir l'identifiant de session de l'utilisateur à partir du cookie et l'envoyer comme premier paramètre de tous les appels AMF. De cette manière, nous évitons tous les problèmes associés aux cookies et à l'AMF. Cela dit, en raison de la façon dont Devise et RubyAMF fonctionnent, Devise ne peut pas obtenir le nom d'utilisateur et le mot de passe que vous avez envoyé via AMF pour vous connecter. Ainsi, même si vous avez envoyé la requête au contrôleur approprié . La raison en est que Warden, sur lequel est basé Devise, extrait le nom d'utilisateur et le mot de passe de la requête du rack. RubyAMF utilise les objets requête et réponse de Rails et modifie les paramètres hash de la requête Rails lors de l'appel d'un contrôleur. Ainsi, lorsque vous faites une demande RubyAMF à l'action de connexion, Devise va connecter l'utilisateur, Warden vérifie la demande de support d'origine et trouve le charabia, et la connexion échoue.

+0

Donc, je devrais utiliser une approche différente avec ruby ​​/ rails pour établir/authentifier des sessions avec RubyAMF? – Joey

+0

Ou pourrais-je auparavant me connecter via Devise et utiliser ExternalInterface pour transmettre les paramètres de la session? – Joey

+0

Vous devrez décider ce qui fonctionne le mieux pour vous. Les applications flash que j'ai développées ont toutes des sites Web correspondants pouvant gérer l'authentification et la configuration de la session. Dans ce cas, le passage du jeton de session en Flash via les variables ExternalInterface ou Flash est relativement simple (bien que la recherche puisse être pénible). Ou il pourrait être plus facile d'écrire quelques extensions à Warden/Devise qui vous permettront de passer un identifiant et un mot de passe en vous-même, plutôt que de tirer de la requête. Je ne connais pas très bien Warden, donc ce ne sera peut-être pas si difficile. – warhammerkid

0

J'ai trouvé une solution de contournement pour cela, et je voudrais des commentaires de personnes, en particulier warhammerkid. Dans notre cas, l'ID de session faisait un tour dans notre application Flex, mais le hachage Rails session était vide lorsqu'il atteignait nos contrôleurs Rails après son passage par RubyAMF. Donc, j'ai forcé une connexion de l'utilisateur si nous réussissons à ressusciter la session. (Autres données de session doit être récupéré manuellement, bien sûr.)

def authenticate_user! 
    recover_session unless user_signed_in? 

    super 
end 

def recover_session 
    session_id = request.cookies['_crm_session'] # Use your session key here 
    return unless session_id 

    verifier = ActiveSupport::MessageVerifier.new(Rails.application.config.secret_token) 
    signed_session = verifier.verify(session_id) 

    user_id = signed_session['warden.user.user.key'].andand[1].andand[0] 
    return unless user_id 

    sign_in(User.find(user_id)) 

rescue ActiveSupport::MessageVerifier::InvalidSignature 
end 

Certaines parties de ce sont spécifiques à notre application ... vous aurez besoin de le modifier en fonction de vos besoins.