2009-04-08 3 views
13

나는 내 레일 사이트에서 아약스 호출을 일부 자바 스크립트가 있습니다. 가능하다면 protect_from_forgery 항목을 계속 유지하고 싶습니다 ...하지만 자바 스크립트 파일에서 인증 토큰을 전달하는 방법에 대한 손실이 있습니까?protect_from_forgery & 겸손한 자바 스크립트

아무도 도와 줄 수 있습니까? 레이아웃에서

답변

21

, 다른 JS 전에이를 추가하는 것은 실행 : 당신이 실수로 다른 자바 스크립트를 덮어 쓸 수 있습니다 덜 가능성이 높습니다 있도록

<script> 
    function authToken() { 
    return '<%= form_authenticity_token if protect_against_forgery? -%>'; 
    } 
</script> 

authToken이 함수로 코딩된다.

또한, 레일 (3)과 같이 인증 토큰이 당신이 읽을 수있는 <meta> 태그로 포함됩니다 : 주 JS에서

<script> 
    function authToken() { 
    return $('meta[name="csrf-token"]').attr('content'); 
    } 
</script> 

, 당신은 다음 authToken()를 호출 할 수 있습니다, 그것은 돌아갑니다 Ajax 호출에 포함 할 문자열로 인증 토큰. 예를 들어, jQuery를 사용 : 당신이 form_for 도우미에 내장 레일 '을 사용하는 경우, 자동으로 숨겨진 입력의 인증 토큰을 추가하는

$.ajax({ 
    type: 'PUT', 
    url: url, 
    data: { 
    foo: bar, 
    authenticity_token: authToken() 
    }, 
    complete: function(data) {} 
}); 

참고. 당신이 숨겨진 인증 토큰을 포함하여 폼의 모든 데이터를 보내려면, 당신은 간단하게 사용할 수 있습니다

var $form = $('form'); 
$.ajax({ 
    url:  $form.attr('action'), 
    type:  $form.attr('method'), 
       // "get" or "post"; overridden by Rails' hidden "_method" 
       // input value, e.g., "put" 
    data:  $form.serialize(), 
       // Includes hidden "authenticity_token" and "_method" inputs 
    complete: function(data) {} 
}); 

을이 패턴은 당신이 이미 JS없이 작동 양식을 작성한 경우 종종 유용하며, ' Ajax를 통해 양식의 데이터를 전송하는 단순한 JS 레이어를 추가했다.

+0

대단히 감사합니다. 매력처럼 일했습니다. –

3

위의 솔루션에 감사드립니다.
레일즈 form_tag를 사용하지 않는 표준 양식을 사용하고 있습니다. 대신 단순히 숨겨진 양식 요소로 추가했습니다.

<form action="..."> 
    <%= hidden_field_tag 'authenticity_token', form_authenticity_token if protect_against_forgery? %> 
    ... rest of form... 
</form> 

작동합니다.