[ruby-on-rails] Rails 4 진품 토큰

진품 토큰 문제가 발생했을 때 새로운 Rails 4 앱 (Ruby 2.0.0-p0)을 작업하고있었습니다.

respond_to클래스 메소드를 사용하여 json에 응답하는 컨트롤러를 작성하는 동안 을 사용하여 레코드를 만들려고 할 때 예외 createActionController::InvalidAuthenticityToken발생 하기 시작한 작업에 도달했습니다 curl.

나는 내가 설정했는지 확인 -H "Content-Type: application/json"하고 데이터를 설정 -d "<my data here>"했지만 여전히 운이 없다.

Rails 3.2 (Ruby 1.9.3)를 사용하여 동일한 컨트롤러를 작성하려고 시도했지만 진위 토큰 문제가 없었습니다. 나는 주변을 검색했고 Rails 4에서 진품 토큰에 약간의 변화가 있음을 알았습니다. 내가 이해 한 것으로부터, 더 이상 자동으로 양식에 삽입되지 않습니까? 이것이 HTML이 아닌 내용 유형에 영향을 미친다고 생각합니다.

HTML 양식을 요청하지 않고 진위성 토큰을 채운 다음 해당 토큰으로 다른 요청을하지 않고도이 문제를 해결할 수 있습니까? 아니면 완전히 명백한 것을 완전히 놓치고 있습니까?

편집 : 방금 아무것도 변경하지 않고 비계를 사용하여 새 Rails 4 앱에서 새 레코드를 만들려고했는데 동일한 문제가 발생하여 내가 한 것이 아니라고 생각합니다.



답변

방금 알아 낸 것 같아요 (새) 기본값을 변경했습니다

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


답변

csrf 보호 기능을 끄는 대신 다음 코드 줄을 양식에 추가하는 것이 좋습니다.

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

form_for 또는 form_tag를 사용하여 양식을 생성하는 경우 양식에 위의 코드 행을 자동으로 추가합니다.


답변

양식에 다음 줄을 추가하면 나에게 도움이되었습니다.

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>


답변

API를 독점적으로 구현하지 않는 한 일반적으로 CSRF 보호를 해제하는 것이 좋지 않다고 생각합니다.

ActionController 에 대한 Rails 4 API 문서를 볼 때 컨트롤러 또는 메소드 기반에서 위조 방지 기능을 끌 수 있음을 발견했습니다.

예를 들어 사용할 수있는 방법에 대해 CSRF 보호를 끄려면

class FooController < ApplicationController
  protect_from_forgery except: :index


답변

같은 문제를 겪었습니다. 컨트롤러에 추가하여 수정했습니다.

      skip_before_filter :verify_authenticity_token, if: :json_request?


답변

시도해 보았 니?

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


답변

이 공식 문서-API에 대한 위조 방지 기능을 올바르게 해제하는 방법에 대해 설명합니다.
http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html