2010-09-20 91 views
1

我想通過使用Devise的adobe flex應用程序登錄到我的Rails應用程序,但無法弄清楚如何將AMF請求映射到Devise :: SessionsController#New。我嘗試以下使用Rails Devise和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> 

當我點擊 「轉到」 按鈕,鐵軌報告以下

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 

任何建議都歡迎。 Thanx

回答

2

首先,AMF確實支持設置和發送cookie數據。不幸的是,有不少老式瀏覽器和過熱的反病毒軟件的組合,它們只會爲AMF流量去掉cookie。爲了避免這些問題,我公司所有受保護的AMF呼叫都需要會話ID進行身份驗證。我們使用Flash中的ExternalInterface從cookie中獲取用戶的會話ID並將其作爲所有AMF調用的第一個參數發送。這樣我們就可以避免與cookies和AMF相關的所有問題。

也就是說,由於Devise和RubyAMF的工作方式,Devise無法獲取您通過AMF發送的用戶名和密碼登錄。因此,即使您將請求發送到適當的控制器和操作,仍然會失敗。

這樣做的原因是,Devise基於的守衛從機架請求中提取用戶名和密碼。 RubyAMF使用Rails請求和響應對象,並在調用控制器時修改Rails請求的參數哈希。因此,當您向登錄操作發出RubyAMF請求時,Devise將登錄該用戶,Warden會檢查原始機架請求並發現亂碼,並且登錄失敗。

+0

所以我應該使用ruby/rails的不同方法來建立/驗證與RubyAMF的會話? – Joey 2010-09-23 17:40:57

+0

或者我以前可以通過Devise登錄並使用ExternalInterface傳遞會話參數? – Joey 2010-09-23 18:31:32

+0

你必須決定什麼最適合你。我開發的Flash應用程序都有相應的網站,可以處理身份驗證和會話設置。在這種情況下,通過ExternalInterface或Flash變量將會話標記傳遞給Flash是相對簡單的(儘管查找會很痛苦)。或者給Warden/Devise寫一些擴展可能會更容易,這樣可以讓你自己傳遞一個登錄名和密碼,而不是從請求中提取。我對守望者不太熟悉,所以它可能並不那麼困難。 – warhammerkid 2010-09-23 22:10:31

0

我找到了解決方法,我想要一些人的意見,特別是warhammerkid

在我們的例子中,會話ID是通過我們的Flex應用程序往返的,但Rails session哈希在它通過RubyAMF傳遞到我們的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 

部件是專門針對我們的應用程序,你將會需要修改,以滿足您的需求。

相關問題