当没有定义 CSRF 时,Angular $resource 查询在 PUT 上获得 401,在定义 CSRF 时在 GET 上获得 404:/

Posted

技术标签:

【中文标题】当没有定义 CSRF 时,Angular $resource 查询在 PUT 上获得 401,在定义 CSRF 时在 GET 上获得 404:/【英文标题】:Angular $resource query gets a 401 on PUT when no CSRF is defined and a 404 on GET when CSRF is defined :/ 【发布时间】:2013-12-10 14:34:20 【问题描述】:

我目前遇到更新列表问题。 我使用 Rails 和 AngularJS。

在 JS 方面,我使用 Angular $resource 功能插入 jQueryUI 以实现可排序功能,以读取、更新(并在第二步中删除和创建)已排序的文本块。

例如。

“1 - lorem ipsum”

“2 - 第二位置 lorem ipsum”

“3 - 第三个位置”


在 AngularJS 控制器中我有这个:

 function DndCtrl($scope, $resource) 
   var Feed = $resource('/users/'+ userId +'/test/:id', id: '@id', 'update': method:"PUT", isArray:true);

   $scope.tests = Feed.query(function() 
    $scope.updateSortable = 
    // jQueryUI methods
     update: function(e, ui) 
     // trigger after user ends dropping item
      for (var i=0; i<$scope.tests.length; i++) 
        var t = $scope.tests[i];
        t.position = i+1;
        t.$update();
      
     ,
     placeholder: "t-hightlight",
     axis: 'y'
    ;
   );

  // end DnD

排序后的输出:

  PUT http://demo.mytest.dev/users/1/test/1 401 (Unauthorized)

并在服务器日志中:

  warning can't verify csrf

于是我在这个话题上找到了:Rails CSRF Protection + Angular.js: protect_from_forgery makes me to log out on POST HuangYuHei 的答案并尝试了一下。

然后控制台输出:

  GET http://demo.mytest.dev/users/1/test 404 (Not Found) 

在服务器日志上:

  Test Load (1.9ms)  SELECT "tests".* FROM "tests" WHERE "tests"."id" = 2 LIMIT 1
  Unpermitted parameters: id

我直接在rails控制台中测试了请求,它很好地返回了条目。

我做错了什么?我错过了 Rails 配置部分的内容吗?还是在 Angular 部分?

【问题讨论】:

【参考方案1】:

您在 Rails 控制器操作中遇到了strong_params 问题。

strong_params 是 Rails 4 中的新功能,它取代了之前版本中的 attr_accessible 模型属性。您现在在控制器中指定允许在查询中使用来自 params 的哪些字段。

它应该看起来像这样:

respond_with Test.find(params.permit(:id))
# or 
render json: Test.find(params.permit(:id))

【讨论】:

哦,谢谢,我觉得我们已经接近解决方案了!!我尝试了您的两种解决方案+在模型中添加了 attr_accessible 。错误输出在 500 状态下发生变化,并带有“参数错误(未知:id)”关于我应该深入挖掘什么的任何想法? 经过一些调查,我有这种行为:角度进行了 $update,Rails 很好地保存在数据库中。一切都很好但是,在前端,控制台返回错误 500。我怎样才能避免显示,因为更新运行良好? 这是 rails 给出的响应,产生了这个错误。在 Rails 上,更新时,我们只需要执行 save() 并渲染页面。 :) 感谢您的指出

以上是关于当没有定义 CSRF 时,Angular $resource 查询在 PUT 上获得 401,在定义 CSRF 时在 GET 上获得 404:/的主要内容,如果未能解决你的问题,请参考以下文章

Cookie 中的 Angular JWT 如何防止 CSRF/XSRF 和 XSS

使用 CSRF_COOKIE_HTTPONLY 将 Django CSRF 令牌传递给 Angular

Angular2 和 Django:CSRF 令牌头痛

使用 AngularJs 发布请求时未设置 CSRF Coo​​kie - Django 后端

Rails 的 Angular 2 CSRF 令牌

在 Spring Boot 和 Angular 之间处理 CORS 和 CSRF