Авторизуйтесь с помощью Rails Devise и Adobe AMF3 - PullRequest
1 голос
/ 20 сентября 2010

Я пытаюсь войти в свое приложение Rails через приложение Adobe Flex, которое использует 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>  

Когда я нажимаю кнопку "идти", рельсы сообщают следующее

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 ]

2 голосов
/ 22 сентября 2010

Во-первых, AMF поддерживает настройку и отправку данных cookie.К сожалению, существует довольно много комбинаций старых браузеров и антивирусных программ, которые исключают файлы cookie только для трафика AMF.Чтобы избежать этих проблем, все защищенные вызовы AMF моей компании требуют идентификатора сеанса для аутентификации.Мы используем ExternalInterface во Flash, чтобы получить идентификатор сеанса пользователя из файла cookie и отправить его в качестве первого параметра всех вызовов AMF.Таким образом, мы избегаем всех проблем, связанных с файлами cookie и AMF.

При этом из-за того, как работают Devise и RubyAMF, Devise не может получить имя пользователя и пароль, которые вы отправили через AMF для входа в систему.даже если вы отправите запрос соответствующему контроллеру и выполните действие, оно все равно не будет выполнено.

Причина этого заключается в том, что Warden, на котором основан Devise, извлекает имя пользователя и пароль из запроса стойки.RubyAMF использует объекты запроса и ответа Rails и изменяет хэш параметров запроса Rails при вызове контроллера.Поэтому, когда вы отправляете запрос RubyAMF для действия по входу в систему, Devise переходит к входу пользователя в систему, Warden проверяет исходный запрос стойки и находит бред, и вход в систему не выполняется.

0 голосов
/ 20 марта 2012

Я нашел обходной путь для этого, и я хотел бы получить некоторую информацию от людей, особенно warhammerkid .

В нашем случае идентификатор сеанса проходил циклически через наше приложение Flex, но хеш Rails session был пустым, когда он достиг наших контроллеров Rails после прохождения через RubyAMF. Поэтому я заставил пользователя войти в систему, если нам удастся воскресить сессию. (Конечно, другие данные сеанса необходимо восстанавливать вручную.)

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

Части этого относятся к нашему приложению ... вам нужно изменить его в соответствии с вашими потребностями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...