1

Deviseを使用するadobeflexアプリケーションを介してRailsアプリにログインしようとしていますが、AMFリクエストをDevise :: SessionsController#Newにマップする方法がわかりません。私は以下を試しました

<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>  

「移動」ボタンをクリックすると、レールは次のように報告します

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

どんな提案も歓迎します。ありがとう

4

2 に答える 2

2

まず、AMFはCookieデータの設定と送信をサポートしています。残念ながら、AMFトラフィックに対してのみCookieを取り除く、古いブラウザと熱心なアンチウイルスソフトウェアの組み合わせはかなりあります。これらの問題を回避するために、私の会社の保護されたAMF呼び出しはすべて、認証のためにセッションIDを必要とします。FlashのExternalInterfaceを使用して、CookieからユーザーのセッションIDを取得し、それをすべてのAMF呼び出しの最初のパラメーターとして送信します。このようにして、CookieとAMFに関連するすべての問題を回避します。

とはいえ、DeviseとRubyAMFの動作方法により、DeviseはAMFを介して送信したユーザー名とパスワードを取得してログインできません。したがって、適切なコントローラーにリクエストを送信してアクションを実行しても、失敗します。

この理由は、DeviseのベースとなっているWardenが、ラックリクエストからユーザー名とパスワードを取得するためです。RubyAMFは、Railsの要求オブジェクトと応答オブジェクトを使用し、コントローラーを呼び出すときにRails要求のパラメーターハッシュを変更します。したがって、ログインアクションに対してRubyAMFリクエストを行うと、Deviseはユーザーにログインし、Wardenは元のラックリクエストをチェックしてぎこちないものを見つけ、ログインは失敗します。

于 2010-09-22T13:01:22.043 に答える
0

これに対する回避策を見つけました。人々、特にwarhammerkidからの意見をお願いします。

この場合、セッションIDはFlexアプリを介してラウンドトリップしsessionていましたが、RubyAMFを通過した後にRailsコントローラーに到達したときにRailsハッシュは空でした。そのため、セッションの復活に成功した場合は、ユーザーのサインインを強制しました。(もちろん、他のセッションデータは手動で回復する必要があります。)

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

これの一部は私たちのアプリに固有です...あなたはあなたのニーズに合うようにそれを変更する必要があります。

于 2012-03-20T17:38:31.710 に答える