2015-01-23 5 views
0

나는 레일즈에 새로운 사람들입니다. 나는레일 4.1.8 : 인증 토큰이 유효하지 않습니다.

<%= csrf_meta_tags %> 
    <%= javascript_tag "var AUTH_TOKEN = '#{form_authenticity_token}';" if protect_against_forgery? %> 

을 내 application.html.erb에 있습니다. data 내 아약스 방법,

data: data + "&authenticity_token="+AUTH_TOKEN, 

을 나는 아약스를 통해 양식을 게시 할 필요가 있고 내가있다. 두 개의 토큰, 즉 게시 메서드 헤더 인증 토큰 X-CSRF-Token과 내가 보낸 사람인 Auth_TOKEN이 동일한 지 확인했습니다. 나는 여전히 Can't verify CSRF token authenticity 오류가 발생합니다. 나는 보안을 건너 뛰고 싶지 않다. 나는 이것을 처리 할 적절한 방법이 필요하다. 어떤 생각? 미리 감사드립니다.

양식

<h3 id="emailModalLabel">Tell Your Friends About Us</h3> 
<form class="form-horizontal col-sm-12 validate" name="emailForm" id="emailForm"> 
    <div class="form-group"><label>Your Name *</label><label class="error" for="your_name" generated="true"></label><input id="your_name" name="your_name" class="form-control required" placeholder="Your name" data-placement="top" data-trigger="manual" data-content="Must be at least 3 characters long, and must only contain letters." type="text"></div> 
    <div class="form-group"><label>Your E-Mail *</label><input id="your_email" name="your_email" class="form-control required email" placeholder="[email protected] (so that your friend can reply to you)" data-placement="top" data-trigger="manual" data-content="Must be a valid e-mail address ([email protected])" type="email"></div> 
    <div class="form-group"><label>Friend's Name *</label><input id="friend_name" name="friend_name" class="form-control required" placeholder="Your friend's name" data-placement="top" data-trigger="manual" data-content="Must be at least 3 characters long, and must only contain letters." type="text"></div> 
    <div class="form-group"><label>Friend's E-Mail *</label><input id="friend_email" name="friend_email" class="form-control required email" placeholder="[email protected] (so that you can email them)" data-placement="top" data-trigger="manual" data-content="Must be a valid e-mail address ([email protected])" type="email"></div> 
    <div class="form-group"><label>Message</label><textarea id="message" name="message" class="form-control" rows="5" placeholder="Your message here.." data-placement="top" data-trigger="manual"></textarea></div> 
    <div class="form-group"><p class="help-block pull-left text-danger hide" id="form-error">&nbsp; The form is not valid. </p></div> 
    <span class="pull-right"><button class="btn col-md-5 col-sm-5 col-xs-5" data-dismiss="modal" aria-hidden="true">Cancel</button><button id="emailSubmit" type="submit" class="btn btn-default pull-right col-md-5 col-sm-5 col-xs-5">Send It!</button></span> 
</form> 

아약스 POST 아약스 요청에 dataserialized입니다

$("#emailForm").validate({ 
    rules:{ 
     your_name: {required: true}, 
     your_email: {required: true, email: true}, 
     friend_email: {required: true, email: true}, 
     friend_name: {required: true} 
    }, 
    submitHandler: function(form) { 
     $("#emailSubmit").prop("disabled", true); 
     var data = $("form#emailForm").serialize(); 
     $.ajax({ 
      type: "POST", 
      url: "/send",//process to mail 
      data: data + "&authenticity_token="+AUTH_TOKEN, 
      success: function(msg){ 
       if(msg['success']){ 
        $(".successContainer").toggleClass("hide", 1000, "easeOutSine"); 
        setTimeout("$('#emailModal').modal('hide')", 5000); 
       }else{ 
        $(".errorContainer").toggleClass("hide", 1000, "easeOutSine"); 
       } 


      }, 
      error: function(){ 
       $(".errorContainer").toggleClass("hide", 1000, "easeOutSine"); 
      } 
     }); 
    } 

}); 

은 그래서 문자열이며, 그 문자열에 토큰을 추가하고있다.

+0

양식을 작성하는 방법을 제공 할 수 있습니까? – kurenn

+0

Ajax가 POST 또는 GET을 통해 전송하고 있습니까? 'data : data + "& authenticity_token ="+ AUTH_TOKEN' 원래'data'는 실제로 문자열이거나 객체입니까? –

+0

내 질문에 편집하여 아약스 요청을 추가했습니다. – user2067888

답변

0

여기에 가장 좋은 방법은처럼 form_tag 내장 레일 도우미를 구현하는 것 : 난 그냥 처음 text_fiel_tag을 포함

<%= form_tag '#', class: 'form-horizontal col-sm-12 validate', name: 'emailForm', id: 'emailForm' do %> 
    <div class="form-group"> 
    <label>Your Name *</label> 
    <label class="error" for="your_name" generated="true"></label> 
    <%= text_field_tag "your_name", "", id: 'your_name', class: 'form-control required', placeholder: 'Your name', data: { placement: 'top', trigger: 'manual', content: 'Must be at least 3 characters long, and must only contain letters.' }%> 
    </div> 
    . 
    . 
    . 
<% end %> 

공지 사항, 당신은 레일을 사용하여 다른 필드 태그를 포함 할 수 있습니다.

무엇이 배후입니까? well Rails는 토큰을 사용하여 CSRF 공격을 방지합니다.

ajax 호출의 경우 양식에서 데이터를 직렬화 한 다음 이미 수행중인 것처럼 모두 보내야합니다.

레일스 작업을 할 때 유용한 팁은 양식, 이미지, 링크 등의 기본 제공 헬퍼를 항상 사용하십시오.

관련 문제