InvalidAuthenticityToken исключение при отправке HTTP POST

2

Мы создаем клиент Java для взаимодействия с сервером Ruby on Rails для проекта системы инвентаризации (для школы).

Клиент, который мы используем, должен использовать HTTP GET для запроса информации и HTTP POST для обновления или создания новой информации (да, мы знаем об HTTP PUT...).

К сожалению, мы сталкиваемся с ошибкой InvalidAuthenticityToken, когда пытаемся выполнить HTTP-сообщение. Мы аутентифицируем через базовую аутентификацию 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 );

Итак, с Rails мы делаем что-то неправильно или это с клиентом Java Jakarta? Любая помощь приветствуется.

  • 0
    Не могли бы вы также добавить код клиента для запроса GET
Теги:
apache-httpclient-4.x

1 ответ

3
Лучший ответ

Вы включаете токен CSRF в свои данные POST?

Смотрите эту ссылку: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html

По умолчанию включена опция protect_from_forgery, которая заставляет Rails требовать токен аутентификации для любых запросов, не связанных с GET. Rails автоматически добавит токен аутентификации в формы, созданные с помощью помощников формы, но я предполагаю, что, поскольку вы создаете свою собственную форму для публикации, вы не включаете токен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню