Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用Rails Desive和Adobe AMF3登录_Ruby On Rails_Apache Flex_Login_Flex4_Devise - Fatal编程技术网

Ruby on rails 使用Rails Desive和Adobe AMF3登录

Ruby on rails 使用Rails Desive和Adobe AMF3登录,ruby-on-rails,apache-flex,login,flex4,devise,Ruby On Rails,Apache Flex,Login,Flex4,Devise,我正试图通过一个AdobeFlex应用程序登录到我的Rails应用程序,该应用程序使用AMF请求,但不知道如何将AMF请求映射到Desive::SessionController#New。我尝试了以下方法 <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://

我正试图通过一个AdobeFlex应用程序登录到我的Rails应用程序,该应用程序使用AMF请求,但不知道如何将AMF请求映射到Desive::SessionController#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

欢迎提出任何建议。首先,AMF支持设置和发送cookie数据。不幸的是,有相当多的旧浏览器和过度狂热的防病毒软件的组合,只针对AMF流量删除cookie。为了避免这些问题,我公司所有受保护的AMF呼叫都需要会话id进行身份验证。我们在Flash中使用ExternalInterface从cookie中获取用户的会话id,并将其作为所有AMF调用的第一个参数发送。通过这种方式,我们避免了与cookie和AMF相关的所有问题

也就是说,由于Desive和RubyAMF的工作方式,Desive无法获得您通过AMF发送的用户名和密码来登录。因此,即使您将请求发送到适当的控制器并执行相应的操作,它仍然会失败


这是因为Warden基于的设计从机架请求中提取用户名和密码。RubyAMF使用Rails请求和响应对象,并在调用控制器时修改Rails请求的参数散列。因此,当您对登录操作发出RubyAMF请求时,Deavise会让用户登录,Warden检查原始机架请求并发现乱码,登录失败。

我找到了解决方法,我想从人们那里得到一些信息,特别是warhammerkid

在我们的例子中,会话ID是通过Flex应用程序往返的,但是Rails
session
hash在经过RubyAMF后到达Rails控制器时是空的。因此,如果我们成功恢复会话,我强制用户登录。(当然,其他会话数据需要手动恢复。)


这部分内容特定于我们的应用程序……您需要对其进行修改以满足您的需要。

因此,我应该使用ruby/rails的另一种方法来建立/验证与RubyAMF的会话?或者我以前可以通过Desive登录并使用ExternalInterface传递会话参数吗?您必须决定什么最适合您你。我开发的flash应用程序都有相应的网站,可以处理身份验证和会话设置。在这种情况下,通过ExternalInterface或flash变量将会话令牌传递到flash中相对简单(尽管查找可能很麻烦)。或者,向Warden/Desive编写一些扩展,允许您自己传递登录名和密码,而不是从请求中退出,这可能会更容易。我对Warden不太熟悉,所以可能没那么难。我在flex中有rails会话令牌,但无法将它们正确地传递到rails中。我试图通过一个“send”服务调用传入sessiontokin,比如“somethingService.new.send(session#id:“#####”)。rails接收散列形式的session参数,比如{0=>{session#id=>'.##},而不是像{“session session id=>'.}}。有什么建议吗?
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