インベントリシステムプロジェクト(学校用)の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のです?どんな助けでも大歓迎です。
GETリクエストのクライアントコードを追加することもできます –