Ruby on rails 使用Rails Desive和Adobe AMF3登录
我正试图通过一个AdobeFlex应用程序登录到我的Rails应用程序,该应用程序使用AMF请求,但不知道如何将AMF请求映射到Desive::SessionController#New。我尝试了以下方法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://
<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