REST-клиент для Ruby предоставляет ActionController :: InvalidAuthenticityToken - PullRequest
4 голосов
/ 07 мая 2009

У меня есть приложение RESTful Rails с ресурсом под названием "Foo". Я пытаюсь использовать REST Client , чтобы сделать пут:

resource = RestClient::Resource.new 'http://localhost:3000/foos/1', :user => 'me', :password => 'secret'
resource.put :name => 'somethingwitty', :content_type => 'application/xml'

Но мое приложение повышает:

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
/usr/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/request_forgery_protection.rb:86:in `verify_authenticity_token'

Кажется, мое приложение не получает сообщение о том, что это запрос XML, и что AuthenticityToken следует игнорировать Возможно, я неправильно использую REST Client. Есть идеи, почему я получаю исключение?

Ответы [ 4 ]

3 голосов
/ 07 мая 2009

Попробуйте добавить: only => [: update,: delete,: create] в строку protect_from_forgery в контроллере приложения.

Подробнее: http://ryandaigle.com/articles/2007/9/24/what-s-new-in-edge-rails-better-cross-site-request-forging-prevention

2 голосов
/ 25 июля 2009

Используйте что-то вроде:

resource.put '<foo><name>somethingwitty</name></foo>', :content_type => 'application/xml'
1 голос
/ 26 мая 2009

Я думаю, вам нужно внести два изменения;

(a) Используйте маршрутизацию рельсов, чтобы пометить это как запрос XML (b) Используйте базовую аутентификацию HTTP для аутентификации запроса.

Это означает, что вы измените свой URL выше, чтобы включить имя пользователя и пароль, как это

мне: секрет @ локальный: 3000 / Foos / 1.xml

также обратите внимание. Xml bit

Я предполагаю, что где-то на вашей стороне сервера у вас есть код, который аутентифицирует входящие запросы через фильтр before. Это должно работать примерно так ...

#
#  If you haven't authenticated already then you are either
#  reqirected to the logon screen (for HTML formats) or 
#  the browser prompts you. You are always allowed to pass 
#  the username/password in the URL
#
def login_required
    @current_user = valid_session?

    unless @current_user
        if params["format"]
            #
            #   If you specify a format you must authenticate now
            # 
            do_basic_authentication
        else
            display_logon_screen
        end
    end
end


#
#   Ask Rails for the login and password then authenticate as if this
#   were a new login.
#
def do_basic_authentication
    user = authenticate_with_http_basic do |login, password|
        User.authenticate(login, password)
    end

    if user
        current_user(@current_user = user)
    else
        request_http_basic_authentication
    end
end

Это из нашего собственного приложения и запускается before_filter в ApplicationController.

Кроме того, я не думаю, что вам нужно: content_type => 'application / xml'. Что я обычно делаю, так это просто звоню или ставлю прямо так ...

response = RestClient.post URI.encode (url),: record => args

где URL содержит базовую аутентификацию и ".xml"

Счастливое кодирование

Chris

0 голосов
/ 20 декабря 2010

Поскольку ваше приложение является приложением Rails, может быть проще использовать ActiveResource для клиента.

Что-то вроде:

require 'active_resource'

class Foo < ActiveResource::Base
  self.site = 'http://localhost:3000/'
end

foo = Foo.new(:name => 'somethingwitty')
foo.save

Вы можете прочитать о том, как выполнить аутентификацию на сайте rdoc .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...