如何使用从RoR应用程序到另一个RoR应用程序的HTTP POST请求来处理AuthenticityToken值?

时间:2011-03-01 10:45:26

标签: ruby-on-rails ruby http ruby-on-rails-3 authenticity-token

我正在使用Ruby on Rails 3,我想知道如何使用从RoR应用程序到另一个RoR应用程序的HTTP POST请求来处理AuthenticityToken值。在这种情况下,我的目的是提交一个登录表单,并以 JSON 格式返回用户信息,如果他提供了正确的emailpassword值。

我在此网址上有一个RoR应用程序

pjtnam.com

此URL上的另一个RoR应用程序

users.pjtname.com

如果我从应用程序pjtname.com向应用程序users.pjtname.com发出HTTP POST请求(在此示例中我使用Typhoeus gem

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

我得到了这个回复

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

那么,如何在安全方法\模式下处理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

在routes.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
   }
 )

RESPONSE

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

REQUEST

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

RESPONSE

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

1 个答案:

答案 0 :(得分:0)

看起来它没有使用正确的内容类型发送请求。如果内容类型是application / xml或application / json,Rails应该跳过真实性令牌检查,以便它可以与API一起使用,而不必完全禁用真实性令牌。

我不知道Typhoeus的宝石,但看起来你可能只需要在网址中添加“.json”或“.xml”(取决于你实施的API),或者可能需要通过它作为标题哈希中的选项。