java - 发送 HTTP POST 时出现 InvalidAuthenticityToken 异常

标签 java ruby-on-rails apache-httpclient-4.x

我们正在为库存系统项目(针对学校)创建一个 Java 客户端来与 Ruby on Rails 服务器交互。

我们使用的客户端应该执行 HTTP GET 来请求信息,并执行 HTTP POST 来更新或创建新信息(是的,我们知道 HTTP PUT...)。

不幸的是,当我们尝试执行 HTTP post 时,遇到了 InvalidAuthenticityToken 错误。我们通过 HTTP 基本身份验证进行身份验证,我们的 Controller 如下所示:

class UsersController < ApplicationController

  before_filter :authenticate

  def show
    @user = User.find(params[:id])
    #@user = User.all
    render :xml => @user.to_xml
  end

  def update
    @user = User.find(params[:id])

    if @user.update_attributes(params[:user])
      render :text => 'Success!'
    else
      render :text => 'No success!'
    end
  end

private
  def authenticate
    logger.info("Entering Authen..")
    authenticate_or_request_with_http_basic do |username, password|
      logger.info("Time: #{Time.now}, username: #{username}, password: #{password}")
      User.authenticate(username, password)
    end
  end

end

显示操作工作正常,并且使用有效的用户名和密码触发身份验证操作(例如,工作正常...)。当我们尝试将更新发布到更新操作时,就会出现问题。当我们尝试它时,我们会收到 InvalidAuthenticityToken 异常。以下来 self 们的开发日志:

#Successful GET
Processing UsersController#show (for 10.18.2.84 at 2010-11-24 19:02:42) [GET]
  Parameters: {"id"=>"2"}
Entering Authen..
Filter chain halted as [:authenticate] rendered_or_redirected.
Completed in 3ms (View: 2, DB: 0) | 401 Unauthorized [http://10.18.2.84/users/show/2]

Processing UsersController#show (for 10.18.2.84 at 2010-11-24 19:02:43) [GET]
  Parameters: {"id"=>"2"}
Entering Authen..
Time: Wed Nov 24 19:02:43 -0600 2010, username: admin, password: pass
  [4;36;1mUser Load (1.0ms)[0m   [0;1mSELECT * FROM "users" WHERE (user_name = 'admin' AND password = 'pass') LIMIT 1[0m
  [4;35;1mUser Load (0.0ms)[0m   [0mSELECT * FROM "users" WHERE ("users"."id" = 2) [0m
Completed in 18ms (View: 2, DB: 1) | 200 OK [http://10.18.2.84/users/show/2]

#Unsuccessful POST    
Processing UsersController#update (for 10.18.2.84 at 2010-11-24 19:03:06) [POST]
  Parameters: {"id"=>"2", "first-name"=>"Macky"}

ActionController::InvalidAuthenticityToken 
(ActionController::InvalidAuthenticityToken):

我们担心的是,它甚至没有尝试验证基本身份验证 - 据我们所知,它跳过了过滤器和整个 Controller 。我们的代码在客户端中非常普通(为了便于理解,对其进行了编辑):

            DefaultHttpClient httpClient = new DefaultHttpClient();
        myCredentials = new UsernamePasswordCredentials( username, password );

        //Set Provider
        provider = new BasicCredentialsProvider();
        provider.setCredentials(scope, myCredentials);

        //Set Credentials
        httpClient.setCredentialsProvider( provider );

            ArrayList<NameValuePair> formparams = new ArrayList<NameValuePair>();
            formparams.add(new BasicNameValuePair("first-name", "Macky"));

            UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(formparams, "UTF-8");

            //Set the post
            post = new HttpPost( url );

            post.setEntity(formEntity);

            response = httpClient.execute( post );

那么,我们是在 Rails 上做错了什么,还是在 Java Jakarta 客户端上做错了?非常感谢任何帮助。

最佳答案

您是否在 POST 数据中包含 CSRF token ?

查看此链接:http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html

默认情况下,protect_from_forgery 处于启用状态,这使得 Rails 需要为任何非 GET 请求提供真实性 token 。 Rails 会自动在使用表单助手创建的表单中包含真实性 token ,但我猜由于您正在构建自己的表单来发布,因此您不会包含 token 。

关于java - 发送 HTTP POST 时出现 InvalidAuthenticityToken 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4273048/

相关文章:

java - 不支持的类版本错误 ireport java maven v raptor

java - 字段的特定 MessageBodyWriter

java - Apache HttpClient 在使用 Wily 代理时抛出异常

java - BasicClientConnManager 使用无效 : connection still allocated

java - 从 eclipse 与浏览器运行 jar

java - 我在 SharedPreferences 保存 int 时遇到问题

mysql - Ruby On Rails - Lynda.com - 上传导师文件

ruby-on-rails - 克隆新创建的记录时忽略验证

ruby-on-rails - 从 rake 任务运行两个 ruby​​ 脚本

java.lang.NoSuchFieldError : INSTANCE with Spring Social on Azure 错误