首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Rails Devise和Adobe AMF3登录

使用Rails Devise和Adobe AMF3登录
EN

Stack Overflow用户
提问于 2010-09-20 08:07:59
回答 2查看 644关注 0票数 1

我试图通过adobe flex应用程序登录到我的Rails应用程序,该应用程序使用Devise,但不知道如何将AMF请求映射到Devise::SessionsController#New。我尝试了以下几种方法

代码语言:javascript
复制
<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>  

当我单击"go“按钮时,rails将报告以下内容

代码语言:javascript
复制
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

欢迎任何建议。谢谢

EN

回答 2

Stack Overflow用户

发布于 2010-09-22 21:01:22

首先,AMF支持设置和发送cookie数据。不幸的是,有相当多的旧浏览器和过于热心的AntiVirus软件的组合,只为AMF流量剥离cookies。为了避免这些问题,我公司的所有受保护的AMF调用都需要会话id进行身份验证。我们在闪存中使用ExternalInterface从cookie中获取用户的会话id,并将其作为所有AMF调用的第一个参数发送。通过这种方式,我们避免了所有与cookie和AMF相关的问题。

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

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

票数 2
EN

Stack Overflow用户

发布于 2012-03-21 01:38:32

我找到了一个解决这个问题的办法,我希望人们能给我一些建议,特别是warhammerkid

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

代码语言:javascript
复制
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

这部分是特定于我们的应用程序的…您需要修改它以满足您的需求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3747986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档