我试图通过adobe flex应用程序登录到我的Rails应用程序,该应用程序使用Devise,但不知道如何将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>
当我单击"go“按钮时,rails将报告以下内容
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欢迎任何建议。谢谢
发布于 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请求并发现胡言乱语,然后登录失败。
发布于 2012-03-21 01:38:32
我找到了一个解决这个问题的办法,我希望人们能给我一些建议,特别是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这部分是特定于我们的应用程序的…您需要修改它以满足您的需求。
https://stackoverflow.com/questions/3747986
复制相似问题