首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >protect_from_forgery &低调的Javascript

protect_from_forgery &低调的Javascript
EN

Stack Overflow用户
提问于 2009-04-08 19:41:17
回答 2查看 2.8K关注 0票数 13

我有一些javascript在我的Rails站点中进行ajax调用:

代码语言:javascript
复制
$.ajax({type: "PUT", url: url, data: { dummy: data }, complete: function(data) {}});

当Rails得到它时,它抛回一个ActionController::InvalidAuthenticityToken错误。如果可能的话,我想把protect_from_forgery的东西放在那里。但是我不知道如何从javascript文件中传递身份验证令牌?

有人能帮我吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-04-08 19:49:32

在您的布局中,在运行任何其他JS之前添加以下代码:

代码语言:javascript
复制
<script>
  function authToken() {
    return '<%= form_authenticity_token if protect_against_forgery? -%>';
  }
</script>

authToken被编码为一个函数,因此您不太可能意外地用其他JavaScript重写它。

或者,从Rails3开始,身份验证令牌被嵌入为<meta>标记,您可以使用以下命令读取该标记:

代码语言:javascript
复制
<script>
  function authToken() {
    return $('meta[name="csrf-token"]').attr('content');
  }
</script>

在您的主JS中,您可以调用authToken(),它将以字符串的形式返回您的身份验证令牌,以包含在您的Ajax调用中。例如,使用jQuery:

代码语言:javascript
复制
$.ajax({
  type: 'PUT',
  url:  url,
  data: {
    foo: bar,
    authenticity_token: authToken()
  },
  complete: function(data) {}
});

请注意,如果使用Rails内置的form_for助手,它会自动在隐藏输入中添加身份验证令牌。如果您想发送表单的所有数据,包括隐藏的auth令牌,您可以简单地使用:

代码语言:javascript
复制
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层时,这种模式通常很有用。

票数 21
EN

Stack Overflow用户

发布于 2009-05-29 21:44:18

感谢上面的解决方案。

我在我的站点中使用了一些不使用rails form_tag的标准表单,所以我只是简单地将其添加为一个隐藏的表单元素。

代码语言:javascript
复制
<form action="...">
    <%= hidden_field_tag 'authenticity_token', form_authenticity_token if protect_against_forgery? %>
    ... rest of form...
</form>

这是一种享受。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/731504

复制
相关文章

相似问题

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