itsource

AJAX를 사용하여 인증 토큰을 Rails로 전송하는 적절한 방법

mycopycode 2023. 3. 23. 22:44
반응형

AJAX를 사용하여 인증 토큰을 Rails로 전송하는 적절한 방법

이것은 동작하지만, 인증 토큰이 없기 때문에 정지됩니다.

$(".ajax-referral").click(function(){
  $.ajax({type: "POST", url: $(this).parent("form").attr("action"), dataType: "script"});
  return false;
});

그래서 이렇게 추가해봤어요.

$(".ajax-referral").click(function(){
  $.ajax({type: "POST", url: $(this).parent("form").attr("action") + "?&authenticity_token=" + AUTH_TOKEN, dataType: "script"});
  return false;
});

auth_token은 파라미터로 올바르게 전달되지만 나머지 폼은 손실되는 것 같습니다.

양식 데이터 전송과 인증 토큰 전송을 모두 완료하려면 어떻게 해야 합니까?

이것은 철도 환경입니다.그리고 내 머릿속에 이게 있어.

= javascript_tag "var AUTH_TOKEN = '#{form_authenticity_token}';" if protect_against_forgery?

내가 시도해 본 것

1.

= hidden_field :authenticity_token, :value => form_authenticity_token

2.

$.ajax({type: "POST", url: $(this).parent("form").attr("action"), dataType: "script", authenticity_token: AUTH_TOKEN});

3.

// Always send the authenticity_token with ajax
$(document).ajaxSend(function(event, request, settings) {
    if ( settings.type != 'GET' ) {
        settings.data = (settings.data ? settings.data + "&" : "")
            + "authenticity_token=" + encodeURIComponent( AUTH_TOKEN );
    }
});

여러분은 '아, 아, 아, 아, 아, 아, 아, 아, 아, 맞다'를 읽고 있습니다.action 및 하려면 폼 폼를 전송하려면 폼해야 합니다.폼 데이터를 시리얼화하여 할 수 있습니다(예: 폼 데이터). 또는 폼 데이터를 직렬화하여 다음과 같이 에이잭스 요청으로 전송할 수 있습니다.

$(".ajax-referral").click(function(){
  $.ajax({
      type: "POST", 
      url: $(this).parent("form").attr("action") + "?&authenticity_token=" + AUTH_TOKEN, 
      data:$(this).parent("form").serialize(),
      dataType: "script"
      });
  return false;
});

이렇게 하면 양식 데이터가 직렬화되어 Ajax 요청과 함께 전송되고 인증 토큰이 쿼리 문자열을 통해 이미 전송되고 있습니다.

또한 상단에 다음 ERB가 있는 경우 이 토큰은 application.html.erb 레이아웃 파일 선두에 있는 "meta" 태그 중 하나에 이미 표시됩니다.

<%= csrf_meta_tag %>

이 ERB는 대략 다음과 같습니다.

<meta content="abc123blahblahauthenticitytoken" name="csrf-token">

그런 다음 다음 코드와 함께 jQuery를 사용하여 가져올 수 있습니다.

var AUTH_TOKEN = $('meta[name=csrf-token]').attr('content');

이 중 어느 것도 잘 되지 않았습니다.X-CSRF-Token다음과 같이 JS를 통해 요청 헤더의 값을 지정합니다.

request.setRequestHeader('X-CSRF-Token', token)

tokenCSRF가 있다.이거 제가 받은 건데<meta name="csrf-token">가 붙어 있고, 「」를 사용하지 않았습니다.encodeURIComponent()

이것은 일부 사용자에게 유용한 것으로 판명되었기 때문에 업데이트

전체적으로는 다음과 같습니다.

var token = document.querySelector('meta[name="csrf-token"]').content
request.setRequestHeader('X-CSRF-Token', token)

감사합니다!

좀 더 일반적인 용도를 위해 명확히 하기 위해서입니다.

머릿속에 var AUTH_TOKEN이 있는 js 태그가 필요합니다.이런 식이어야 합니다.

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

그 후, 자신의 진정성을 간단하게 표현해 주세요_http=부모(폼) 등을 사용할 필요가 없는 경우 AUTH_TOKEN 데이터를 사용합니다.

$.ajax({
  type: 'post',
  dataType:'text',
  data: "user_id="+user_id+"&authenticity_token="+AUTH_TOKEN,
  url:'/follow/unfollow'
})

이 지식을 공유해 주신 위 분들께 감사드립니다!

5.1 Rails 5.1+를 됩니다.Rails(AJAX에서) JS 도우미(From)rails-ujs예:) 예:

Rails.ajax({
  url: "/your/url",
  type: "POST",
  data: "a=1&b=2",
  success: function(data) {
    console.log(data);
  }
});

이 라이브러리에서는 CSRF 토큰을 수동으로 취득할 수 있는 도우미도 제공됩니다.

Rails.csrfToken();

숨김 입력으로서 폼 자체에 AUTH_TOKEN 을 포함할 수 있습니다.

<input type="hidden" name="AUTH_TOKEN">1234abcd</input>

방금 이 문제에 부딪혔는데 응용 프로그램.js 파일에서 다음 방법을 시도했습니다.

$(document).ajaxSend(function(e, xhr, options) {
  if (options.data == null) {
    options.data = {};
  }
  options.data['authenticity_token'] = token;
});

이것이 제가 아이디어를 얻은 첫 번째 질문입니다.ajax 질문 보내기

다음은 모든 AJAX 요청에 적용되는 솔루션입니다.다음 항목을 all.js(또는 사이트 전체의 javascript 파일)에 추가합니다.

$.ajaxSetup({
    headers: {
        'X-CSRF-Token': document.querySelector('meta[name="csrftoken"]').content
    }
});

그러면 토큰이 모든 AJAX 요청의 헤더로 자동으로 추가됩니다.7번 철도로는 통합니다.

단순히 form_tag를 사용하면 CSRF 토큰 파라미터가 자동으로 포함됩니다.Rails는 "Unoblusive Javascript"를 지원하므로 폼은 여전히 AJAX를 통해 제출됩니다.컨트롤러 액션은 "response_to" 블록을 지원하며 확장자 .js.erb를 사용하여 폼 제출에 대한 응답으로 웹 페이지를 변경할 수 있습니다.

언급URL : https://stackoverflow.com/questions/7560837/proper-way-to-send-an-authenticity-token-with-ajax-to-rails

반응형