2010-11-25 6 views
2

インベントリシステムプロジェクト(学校用)のRuby on RailsサーバとインターフェースするJavaクライアントを作成しています。HTTP POSTを送信するときにInvalidAuthenticityToken例外が発生する

私たちが使用しているクライアントは、HTTP GETを使って情報を要求し、HTTP POSTは新しい情報を更新または作成することになっています(HTTP PUTについてはわかっています)。

残念ながら、私たちがHTTPポストを実行しようとすると、InvalidAuthenticityTokenエラーが発生しています。私たちは、HTTP基本認証による認証を行い、当社のコントローラは、次のようになります。

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 

showアクションは完璧に動作し、認証アクションが(例えば、細かい作業...)、有効なユーザー名とパスワードを使用してトリガされます。アップデートアクションの更新をPOSTしようとすると、問題が発生します。これを試みると、InvalidAuthenticityToken例外が発生します。以下は、当社の開発ログからである: - それは限り我々が言うことができるようにフィルタとコントローラ全体をスキップしています

#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): 

私たちの関心は、それも基本認証を認証しようとしていないことです。私たちのコードは、クライアントではかなりバニラ(これは、それが実際にあるものから、わかりやすさのためにダウンし編集する)されています

  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); 

だから、それは我々が何か間違ったことをやっているか、それがJavaのジャカルタのクライアントであるRailsのです?どんな助けでも大歓迎です。

+0

GETリクエストのクライアントコードを追加することもできます –

答えて

3

POSTデータにCSRFトークンを含めていますか?

このリンクを参照してください:デフォルトprotect_from_forgeryではhttp://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html

は、Railsは、任意の非GET要求のための真正トークンを必要となりますどの有効になっています。 Railsはフォームヘルパーで作成されたフォームに真偽トークンを自動的に組み込みますが、投稿する独自のフォームを作成しているので推測しています。トークンは含まれていません。

関連する問題