首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用AJAX向Rails发送身份验证令牌的正确方法

使用AJAX向Rails发送身份验证令牌的正确方法
EN

Stack Overflow用户
提问于 2011-09-27 04:20:22
回答 8查看 38.2K关注 0票数 40

这是可行的,但由于缺少真实性令牌而被停止:

代码语言:javascript
复制
$(".ajax-referral").click(function(){
  $.ajax({type: "POST", url: $(this).parent("form").attr("action"), dataType: "script"});
  return false;
});

所以我试着像这样添加:

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

它正确地传递了auth_token作为参数,但似乎丢失了表单的其余部分。

有没有办法既能发送有效的表单数据,又能完成身份验证令牌?

这是一个rails环境。我的脑海里就有了这个。

代码语言:javascript
复制
= javascript_tag "var AUTH_TOKEN = '#{form_authenticity_token}';" if protect_against_forgery?

的事情我已经尝试过了

1.

代码语言:javascript
复制
= hidden_field :authenticity_token, :value => form_authenticity_token

2.

代码语言:javascript
复制
$.ajax({type: "POST", url: $(this).parent("form").attr("action"), dataType: "script", authenticity_token: AUTH_TOKEN});

3.

代码语言:javascript
复制
// 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 );
    }
});
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-09-27 20:40:28

实际上,您正在读取form的action属性并向其发送post ajax请求。要发送表单数据,您必须提交表单,或者可以序列化表单数据并在ajax请求中发送它,如下所示

代码语言:javascript
复制
$(".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请求一起发送,并且身份验证令牌已经通过查询字符串发送

票数 33
EN

Stack Overflow用户

发布于 2013-11-18 07:21:38

默认情况下,如果在顶部有以下ERB,则此标记也已出现在application.html.erb版面文件头部的一个"meta“标记中:

代码语言:javascript
复制
<%= csrf_meta_tag %>

再培训局大致呈现为:

代码语言:javascript
复制
<meta content="abc123blahblahauthenticitytoken" name="csrf-token">

然后,您可以通过以下代码使用jQuery获取它:

代码语言:javascript
复制
var AUTH_TOKEN = $('meta[name=csrf-token]').attr('content');
票数 33
EN

Stack Overflow用户

发布于 2015-03-17 04:52:51

在我通过JS在请求头上设置X-CSRF-Token值之前,这些方法都不起作用:

代码语言:javascript
复制
request.setRequestHeader('X-CSRF-Token', token)

当然,token是CSRF令牌。我没有使用encodeURIComponent(),而是从<meta name="csrf-token">标签获得的

更新,因为事实证明这对某些人很有用

所以总而言之:

代码语言:javascript
复制
var token = document.querySelector('meta[name="csrf-token"]').content
request.setRequestHeader('X-CSRF-Token', token)
票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7560837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档