경고: CSRF 토큰 인증 레일을 확인할 수 없습니다.
AJAX를 사용하여 보기에서 컨트롤러로 데이터를 보내는데 다음 오류가 발생했습니다.
경고: CSRF 토큰 정품 여부를 확인할 수 없습니다.
이 토큰을 데이터와 함께 보내야 할 것 같습니다.
이거 어떻게 하는지 아는 사람?
편집: 내 솔루션
저는 AJAX post에 다음 코드를 넣음으로써 이 작업을 수행했습니다.
headers: {
'X-Transaction': 'POST Example',
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
},
이렇게 해야 합니다.
당신이 가지고 있는지 확인해 보세요.
<%= csrf_meta_tag %>
당신의더하다
beforeSend
아래와 같이 헤더를 설정해 달라는 모든 ajax 요청에 다음과 같이 응답합니다.
$.ajax({ url: 'YOUR URL HERE',
type: 'POST',
beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))},
data: 'someData=' + someData,
success: function(response) {
$('#someDiv').html(response);
}
});
모든 요청에서 토큰을 보내려면 다음을 사용할 수 있습니다.
$.ajaxSetup({
headers: {
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
}
});
이것을 하는 가장 좋은 방법은 사실 그냥 사용하는 것입니다.<%= form_authenticity_token.to_s %>
토큰을 직접 레일 코드에 인쇄할 수 있습니다.. javascript를 사용하면 crf 토큰을 찾을 수 .아래와 ;아래와 같이 헤더 옵션을 추가하기만 하면 됩니다.
$.ajax({
type: 'post',
data: $(this).sortable('serialize'),
headers: {
'X-CSRF-Token': '<%= form_authenticity_token.to_s %>'
},
complete: function(request){},
url: "<%= sort_widget_images_path(@widget) %>"
})
제 기억이 맞다면 양식에 다음 코드를 추가해야 이 문제를 해결할 수 있습니다.
<%= token_tag(nil) %>
매개 변수를 잊지 마십시오.
정말 간단한 방법입니다.머리글을 바꾸는 것에 신경 쓰지 마세요.
다음 사항이 있는지 확인합니다.
<%= csrf_meta_tag %> in your layouts/application.html.erb
숨김 입력 필드를 다음과 같이 하면 됩니다.
<input name="authenticity_token"
type="hidden"
value="<%= form_authenticity_token %>"/>
또는 jQuery ajax 게시물을 원하는 경우:
$.ajax({
type: 'POST',
url: "<%= someregistration_path %>",
data: { "firstname": "text_data_1", "last_name": "text_data2", "authenticity_token": "<%= form_authenticity_token %>" },
error: function( xhr ){
alert("ERROR ON SUBMIT");
},
success: function( data ){
//data response can contain what we want here...
console.log("SUCCESS, data="+data);
}
});
crf 메타 태그를 포함하여 오래된 앱에서 레일 3.1로 업그레이드해도 여전히 해결되지 않습니다.rubyonrails.org 블로그에서는 몇 가지 업그레이드 팁을 제공하고 있으며, 구체적으로 레이아웃의 머리 부분에 포함되어야 할 jquery 라인은 다음과 같습니다.
$(document).ajaxSend(function(e, xhr, options) {
var token = $("meta[name='csrf-token']").attr("content");
xhr.setRequestHeader("X-CSRF-Token", token);
});
이 블로그 포스트: http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails 에서 가져온 것입니다.
저 같은 경우는 각각의 ajax 요청에 따라 세션이 재설정되고 있었습니다.위 코드를 추가하면 그 문제가 해결되었습니다.
- 당신이 가지고 있는지 확인해 보세요.
<%= csrf_meta_tag %>
당신의 - 를 합니다.
beforeSend
헤더를 설정하기 위한 ajax 요청에 crf-signal을 포함합니다.r에 필요합니다.post
요청한다.
는 crf-token에서 할 수 .rails/jquery-ujs
, 그래서 저는 다음과 같이 그것을 그냥 사용하는 것이 가장 쉽습니다.
$.ajax({
url: url,
method: 'post',
beforeSend: $.rails.CSRFProtection,
data: {
// ...
}
})
여기서 투표된 상위 답변은 맞지만 jQuery에게 명시적으로 세션 쿠키를 전달하라고 말하지 않으면 세션을 사용할 수 없기 때문에 도메인 간 요청을 수행하는 경우에는 작동하지 않습니다.다음은 이를 수행하는 방법입니다.
$.ajax({
url: url,
type: 'POST',
beforeSend: function(xhr) {
xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))
},
xhrFields: {
withCredentials: true
}
});
당신이 찾고 있는 대부분의 답을 기사에 담고 있고 또한 매우 흥미롭기 때문에 이것을 여기에 연결하려고 생각했습니다.
아래와 같이 글로벌하게 작성하시면 됩니다.
일반 JS:
$(function(){
$('#loader').hide()
$(document).ajaxStart(function() {
$('#loader').show();
})
$(document).ajaxError(function() {
alert("Something went wrong...")
$('#loader').hide();
})
$(document).ajaxStop(function() {
$('#loader').hide();
});
$.ajaxSetup({
beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))}
});
});
커피 대본:
$('#loader').hide()
$(document).ajaxStart ->
$('#loader').show()
$(document).ajaxError ->
alert("Something went wrong...")
$('#loader').hide()
$(document).ajaxStop ->
$('#loader').hide()
$.ajaxSetup {
beforeSend: (xhr) ->
xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))
}
만약 당신이 jQuery를 사용하지 않고 요청을 위해 fetch API와 같은 것을 사용한다면 당신은 다음을 사용하여 얻을 수 있습니다.csrf-token
:
document.querySelector('meta[name="csrf-token"]').getAttribute('content')
fetch('/users', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').getAttribute('content')},
credentials: 'same-origin',
body: JSON.stringify( { id: 1, name: 'some user' } )
})
.then(function(data) {
console.log('request succeeded with JSON response', data)
}).catch(function(error) {
console.log('request failed', error)
})
이런..
지원서에서 다음 줄을 놓쳤습니다.js
//= require jquery_ujs
교체했는데 작동이 되네요.
======= 업데이트됨 =========
5년 만에 동일한 오류로 돌아왔고, 지금은 새로운 Rails 5.1.6을 가지고 있고, 이 게시물을 다시 찾았습니다.인생의 원처럼.
문제는 다음과 같습니다. Rails 5.1은 jquery와 jquery_ujs에 대한 지원을 기본적으로 제거하고 추가했습니다.
//= require rails-ujs in application.js
다음과 같은 작업을 수행합니다.
- 다양한 조치에 대한 강제 확인 대화상자.
- 하이퍼링크에서 GET 이외의 요청을 합니다.
- 양식 또는 하이퍼링크가 Ajax와 비동기식으로 데이터를 제출하도록 합니다.
- submit 버튼은 더블 클릭을 방지하기 위해 submit 양식에서 자동으로 비활성화됩니다. (from: https://github.com/rails/rails-ujs/tree/master)
그런데 왜 ajax 요청에 대한 crf 토큰이 포함되어 있지 않습니까?이것에 대해 자세히 아는 사람이 있으면 저에게 댓글을 달아주세요.감사합니다.
어쨌든 저는 사용자 지정 js 파일에 다음을 추가하여 작동시켰습니다. (이 코드에 도달하는 데 도움이 되는 다른 답변 감사합니다.)
$( document ).ready(function() {
$.ajaxSetup({
headers: {
'X-CSRF-Token': Rails.csrfToken()
}
});
----
----
});
jquery.jpf(https://github.com/swordray/jquery.csrf) 를 사용합니다.
레일 5.1 이상
$ yarn add jquery.csrf
//= require jquery.csrf
레일 5.0 이전
source 'https://rails-assets.org' do gem 'rails-assets-jquery.csrf' end
//= require jquery.csrf
소스코드
(function($) { $(document).ajaxSend(function(e, xhr, options) { var token = $('meta[name="csrf-token"]').attr('content'); if (token) xhr.setRequestHeader('X-CSRF-Token', token); }); })(jQuery);
jQuery와 함께 javascript를 사용하여 양식의 토큰을 생성하는 경우 다음과 같이 작동합니다.
<input name="authenticity_token"
type="hidden"
value="<%= $('meta[name=csrf-token]').attr('content') %>" />
, 은 이 합니다 합니다 이 이 있어야 합니다.<%= csrf_meta_tag %>
당신의 루비 레이아웃에.
저는 이 문제로 며칠 동안 고생했습니다.모든 GET 호출이 올바르게 작동하지만 모든 PUT는 "CSRF 토큰 인증을 확인할 수 없습니다" 오류를 발생시킵니다.제 웹사이트는 제가 tginx에 SSL 인증서를 추가하기 전까지는 잘 작동하고 있었습니다.
nginx 설정에서 이 누락된 줄을 우연히 발견했습니다.
location @puma {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Forwarded-Proto https; # Needed to avoid 'WARNING: Can't verify CSRF token authenticity'
proxy_pass http://puma;
}
누락된 행 "proxy_set_header X-Forwarded-Proto https;"를 추가한 후 모든 CSRF 토큰 오류가 종료됩니다.
이것이 벽에 머리를 부딪치고 있는 다른 사람에게도 도움이 되기를 바랍니다. 하하.
jQuery가 아닌 답변이 필요한 분들은 다음 사항을 간단히 추가할 수 있습니다.
xmlhttp.setRequest헤더('X-CSRF-Token', $('float[name="floatf-float"). attr('content');
매우 간단한 예를 여기서 확인할 수 있습니다.
xmlhttp.open("POST", example.html", true); xmlhttp.setRequest머리글('X-CSRF-Token', $('float[name="floatf-float"). attractcontent')); xmlhttp.send();
Uploadify 및 Rails 3.2와 관련된 도움이 필요한 사람이 있다면(이 게시물을 구글링했을 때의 나처럼), 이 샘플 앱이 도움이 될 수 있습니다: https://github.com/n0ne/Uploadify-Carrierwave-Rails-3.2.3/blob/master/app/views/pictures/index.html.erb
또한 이 앱에서 컨트롤러 솔루션을 확인합니다.
Rails 4.2.4를 사용하고 있는데 왜 다음을 얻었는지 이해하지 못했습니다.
Can't verify CSRF token authenticity
배치도에 있어요
<%= csrf_meta_tags %>
컨트롤러에서:
protect_from_forgery with: :exception
호출중tcpdump -A -s 999 -i lo port 3000
(헤더를 설정할 필요가 없음에도 불구하고) 헤더가 설정되는 것을 보여주고 있었습니다.ajaxSetup
- 이미 완료됨):
X-CSRF-Token: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
DNT: 1
Content-Length: 125
authenticity_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
결국 쿠키를 꺼놓았기 때문에 실패하고 말았습니다.쿠키를 활성화하지 않으면 CSRF가 작동하지 않으므로 이 오류가 발생할 수 있습니다.
언급URL : https://stackoverflow.com/questions/7203304/warning-cant-verify-csrf-token-authenticity-rails
'programing' 카테고리의 다른 글
Spring Data에서 동일한 QueryDSL 경로에 대해 여러 개 (0) | 2023.09.08 |
---|---|
YamlPropertiesFactoryBean을 사용하여 Spring Framework 4.1을 사용하여 YAML 파일을 로드하는 방법은 무엇입니까? (0) | 2023.09.08 |
부트스트랩은 나비 막대 항목을 오른쪽으로 정렬합니다. (0) | 2023.09.08 |
Last not empty cell (column) in the given row; Excel VBA (0) | 2023.09.08 |
f:ajax로 여러 구성요소 렌더링 (0) | 2023.09.08 |