Я использую 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 "/authentications/new.json"