Вопрос по ruby, ruby-on-rails-4, ruby-on-rails, authenticity-token – Rails 4 токен подлинности

196

Я работал над новым приложением Rails 4 (на Ruby 2.0.0-p0), когда столкнулся с некоторыми проблемами с токенами аутентичности.

Во время написания контроллера, который отвечает на JSON (используяrespond_to метод класса), я добрался доcreate действие, которое я начал получатьActionController::InvalidAuthenticityToken исключения, когда я пытался создать запись с помощью.curl

Я убедился, что я установил-H "Content-Type: application/json" и я установил данные с-d "" но все равно не повезло.

Я попытался написать тот же контроллер с использованием Rails 3.2 (на Ruby 1.9.3), и у меня не возникло проблем с токеном подлинности. Я искал вокруг и увидел, что в Rails 4 произошли некоторые изменения с токенами аутентификации. Насколько я понимаю, они больше не вставляются автоматически в формы? Я полагаю, это как-то влияет на типы контента, отличные от HTML.

Есть ли способ обойти это без необходимости запрашивать HTML-форму, перехватывая токен аутентификации, а затем отправляя другой запрос с этим токеном? Или я что-то упускаюСовершенно очевидно?

Редактировать: Я просто попытался создать новую запись в новом приложении Rails 4, используя скаффолд, ничего не меняя, и я 'Я сталкиваюсь с той же проблемой, так что я думаю,это не то, что я сделал.

Ваш Ответ

13   ответов
4

как правильно отключить защиту от подделки для API.http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html

Тот'Это правда, но ответ с 2013 года - и все меняется. И хотя ваш официально принятый ответ хорош - моя ссылка просто дает более глубокий обзор предмета konung
3

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>

Документация может быть найдена здесь:http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html

2



Однако, чтобы ответить на ваш вопрос, вот некоторые материалы. Вы можете добавить эти строки после вашего имени контроллера.

Вот так,

class NameController < ApplicationController
    skip_before_action :verify_authenticity_token

Вот несколько строк для разных версий рельсов.

Рельсы 3

skip_before_filter: verify_authenticity_token

Рельсы 4:

skip_before_action: verify_authenticity_token



Если вы намереваетесь отключить эту функцию безопасности для всех подпрограмм контроллера, вы можете изменить значениеprotect_from_forgery в: null_session в вашем файле application_controller.rb.

Вот так,

class ApplicationController < ActionController::Base
  protect_from_forgery with: :null_session
end
1

При использовании jQuery с rails, будьте осторожны, разрешив вход в методы без проверки токена аутентификации.

JQuery-UJS может управлять токенами для вас

Он должен быть уже в составе гема jquery-rails, но вам может понадобиться включить его в application.js с

//= require jquery_ujs

Тот'Все, что вам нужно - теперь ваш Ajax-вызов должен работать

Для получения дополнительной информации см .:https://github.com/rails/jquery-ujs

0

еременную окружения как non-test:

export RAILS_ENV=something_non_test

Я забыл сбросить эту переменную, из-за которой я начал получатьActionController::InvalidAuthenticityToken исключение.

После сброса$RAILS_ENVмои тесты снова начали работать.

32

что этохорошо вообще отключить защиту CSRF, если вы нет исключительно реализовать API.

При просмотре документации по Rails 4 API дляActionController Я обнаружил, что вы можете отключить защиту от подделки для каждого контроллера или для каждого метода.

Например, чтобы отключить защиту CSRF для методов, которые вы можете использовать

class FooController < ApplicationController
  protect_from_forgery except: :index
Это сделало это для меня в Rails 4 - ошибка выдается после попытки удаления. ^^ zero_cool
7

Ты пробовал?

 protect_from_forgery with: :null_session, if: Proc.new {|c| c.request.format.json? }
1

authenticity_token: true к тегу формы

272

я только что понял это. Я изменил (новый) по умолчанию

protect_from_forgery with: :exception

в

protect_from_forgery with: :null_session

согласно комментарию в.ApplicationController

# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.

Вы можете увидеть разницу, посмотрев на источникrequest_forgery_protecton.rbили, более конкретно, следующие строки:

ВРельсы 3.2:

# This is the method that defines the application behavior when a request is found to be unverified.
# By default, \Rails resets the session when it finds an unverified request.
def handle_unverified_request
  reset_session
end

ВРельсы 4:

def handle_unverified_request
  forgery_protection_strategy.new(self).handle_unverified_request
end

Который позвонитследующие:

def handle_unverified_request
  raise ActionController::InvalidAuthenticityToken
end
У меня была та же проблема, но моя проблема была в том, что я просто пропустил команду rails в моем тег. a.barbieri
В рельсах 4.1.6 пришлось указыватьskip_before_action :verify_authenticity_token в моем APIс приложением контроллера, чтобы сделать эту работу. Waseem
Вы можете удалить опцию: with вместе, по умолчанию: null_session:api.rubyonrails.org/classes/ActionController/... Casey
Есть ли способ использовать исключение для вызовов не-JSON и нулевой сеанс для вызовов JSON (иначе вызовы API)? James McMahon
0

вы должны включить строку токена аутентификации, которая должна быть отправлена на контроллер по соображениям безопасности. Если вы используете rails form helper для генерации токена подлинности, он добавляется в форму следующим образом.

<form accept-charset="UTF-8" action="/login/signin" method="post">
  <div style="display:none">
    <input name="utf8" type="hidden" value="✓">
    <input name="authenticity_token" type="hidden" value="x37DrAAwyIIb7s+w2+AdoCR8cAJIpQhIetKRrPgG5VA=">
  </div>
    ...
</form>

Таким образом, решение проблемы заключается в том, чтобы либо добавить поле authenticity_token, либо использовать помощники по рельсам, а не ставить под угрозу безопасность и т. Д.

если содержимое запроса на самом деле не является JSON, в этом случае вы захотите установить его.application/json alexcoco
Спасибо за ваш ответ, хотя это не отвечает на первоначальный вопрос. Был задан вопрос об ответе на запросы JSON, но вы предоставляете решение для HTML-формы с нуля. При выполнении запросов JSON (например, API) вы не отправляете форму HTML, и у вас может не быть легкого доступа к токену подлинности. alexcoco
Я понимаю, что ответ не совсем то, что вы ищете. Но цель поставить связанный ответ состоит в том, чтобы помочь пользователям, ищущим подобное "Проблемы подлинности ". amjad
извини я удалил по ошибке -Вы можете установить Content-Type: application / x-www-form-urlencoded с указанным выше решением ". amjad
70

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
этот код работал и для меня (rails5) Stef Hej
Еще более лаконично, чем приведенный выше код. Спасибо! David Routen
Безразлично»действительно применимо к вызовам API courtsimas
В моем случае ям с использованием Rails4. Я могу отправить форму, нажав кнопку отправки. Но если я отправляю форму через код JS, эта ошибка возникает. И этот ответ решил проблему для меня. Chris.Zou
71

Лучше добавить следующую строку кода в форму

<%= tag(:input, :type => "hidden", :name => request_forgery_protection_token.to_s, :value => form_authenticity_token) %> 

и если вы'повторно использовать form_for или form_tag для генерации формы, тогда она автоматически добавит вышеуказанную строку кода в форму

Спасибо, однако, это ответило на мой вопрос о написании кода вручную при использовании руля! David Routen
Это хороший совет, если вы создаете форму, но вопрос касается выполнения вызовов API с использованием JSON. James McMahon
8

      skip_before_filter :verify_authenticity_token, if: :json_request?
Вы должны определить метод там как: def json_request? request.format.json? конец Jai Kumar Rajput
неопределенный метод `json_request? ' для # <SettingsController: 0x000000030a54a8>, Любая идея? Deano

Похожие вопросы