使用Backbone.js发布到Yii PHP框架

时间:2012-06-08 15:07:42

标签: post backbone.js yii xmlhttprequest csrf

我正在尝试使用Backbone.js模型保存到我的Yii Web应用程序但是我收到“CSRF令牌无法验证”响应,即使模型是序列化表单并且我使用Backbone.sync来设置标题。

模型(表单中包含CSRF令牌并将其作为“YII_CSRF_TOKEN”属性发送):

var v = new ModelName ($('.formclass').serializeJSON()); 

JSON序列化程序:

 //form.serializeJSON
 (function( $ ){
 $.fn.serializeJSON=function() {
 var json = {};
 jQuery.map($(this).serializeArray(), function(n, i){
 json[n['name']] = n['value'];
 });
 return json;
 };
 })( jQuery );

backbone.sync:

Backbone.old_sync = Backbone.sync;
     Backbone.sync = function(method, model, options) {
     var new_options =  _.extend({
         beforeSend: function(xhr) {
             console.log('backbone sync');
             var token = model.get('X_CSRF_TOKEN');
             console.log('token ='+token)
             if (token) xhr.setRequestHeader('YII_CSRF_TOKEN', token);
         }
     }, options)
        Backbone.old_sync(method, model, new_options);
 };

我也尝试将标题设置为'X_CSRF_TOKEN',但无济于事。

3 个答案:

答案 0 :(得分:0)

YII_CSRF_TOKEN 不是标题,它只是一个表单值。 根据{{​​3}}行,我们的请求必须包含

  • 一个CSRF cookie,它已经由第一个非XHR页面加载设置
  • 名为 YII_CSRF_TOKEN
  • 的表单数据值

答案 1 :(得分:0)

如果您使用save()发送数据,则必须在参数中发送cookie和会话ID。请在此处查看此博客文章的缓存版本(现在离线):http://webcache.googleusercontent.com/search?q=cache:tML1kmL08ikJ:blog.opperator.com/post/15671431847/backbone-js-sessions-and-authentication+&cd=1&hl=en&ct=clnk

答案 2 :(得分:0)

如果您正在使用localhost,则可能需要设置虚拟主机才能执行此线程中所述的cookie身份验证:this thread

IE和Chrome不接受来自localhost的Cookie,因此可能是

的原因