Как обработать значение AuthenticityToken с помощью HTTP-запроса POST от приложения RoR к другому приложению RoR? - PullRequest
0 голосов
/ 01 марта 2011

Я использую Ruby on Rails 3, и я хотел бы знать, как обрабатывать значение AuthenticityToken с помощью HTTP-запроса POST из приложения RoR в другое приложение RoR. В этом случае я хочу отправить форму входа и вернуть информацию о пользователе в формате JSON , если он предоставил правильные значения email и password.

У меня есть приложение RoR по этому URL

pjtnam.com

и другое приложение RoR по этому адресу

users.pjtname.com

Если я сделаю HTTP-запрос POST от приложения pjtname.com к приложению users.pjtname.com следующим образом (в этом примере я использую Typhoeus gem )

response = Typhoeus::Request.post("http://users.pjtname.com/authentications",
             :params => {
               :new_authentication => {
                 :email    => email,
                 :password => password
               }
             }
           )

Я получаю этот ответ

<code><h1>
  ActionController::InvalidAuthenticityToken
    in AuthenticationsController#create
</h1>
<pre>ActionController::InvalidAuthenticityToken

Итак, как обрабатывать значение AuthenticityToken в безопасном подходе \ режиме? Я хотел бы знать, когда приложения расположены на одном сервере, а когда нет.

На http://users.pjtname.com/authentications/new У меня есть следующая форма для входа пользователей:

<%= form_for(:new_authentication) do |f| %>
  <%= f.label :email %>
  <%= f.label :password %>

  <%= f.submit "Sign in" %>
<% end %>

В authentications_controller.rb у меня есть

def create
  # Note ':authentication' symbol is different than ':new_authentication' seen in HTTP POST parameters and in the above form
  @authentication = Authentication.new(params[:authentication])

  @account = Account.sign_in_account(params[:new_authentication][:email], params[:new_authentication][:password])

  ...

  respond_to do |format|
    format.html {
      redirect_to @account
    }
    format.js {
      render(:update) { |page|
        page.redirect_to @account
      }
    }
    format.json {
      render :json => @account
    }
  end
end

В route.rb у меня

  resources :authentications do #, :path => "authentication" do
    member do
      get  'confirm_authentication'
      post 'confirm_authentication'
    end
  end


ОБНОВЛЕНИЕ для @ idlefingers ответ


ЗАПРОС

Typhoeus::Request.post("http://users.pjtname.com/authentications/new",
# or
# Typhoeus::Request.post("http://users.pjtname.com/authentications",
   :headers => {"Content-Type" => "application/json"},
   :params => { ... } # Same parameters as above
   }
 )

РЕАКЦИЯ

<code><h1>
  StandardError
</h1>
<pre>Invalid JSON string

REQUEST

Typhoeus::Request.post("http://users.pjtname.com/authentications/new.json",
   :params => { ... } # Same parameters as above
   }
 )

РЕАКЦИЯ

<code><h1>Routing Error</h1>
<p><pre>No route matches &quot;/authentications/new.json&quot;

1 Ответ

0 голосов
/ 01 марта 2011

Похоже, что он не отправляет запрос с правильным типом контента.Rails должен пропустить проверку токена подлинности, является ли тип контента application / xml или application / json, чтобы он хорошо работал с API без необходимости полностью отключать токен подлинности.

Я не знаю Typhoeusgem, но, похоже, вам может понадобиться просто добавить «.json» или «.xml» к URL (в зависимости от реализованного вами API) или, возможно, потребуется передать его в качестве параметров в хеш заголовков.

...