Angular 路由中的 Rails CSRF 令牌问题

Posted

技术标签:

【中文标题】Angular 路由中的 Rails CSRF 令牌问题【英文标题】:Rails CSRF token issue in Angular routes 【发布时间】:2014-10-08 00:56:16 【问题描述】:

我正在使用带有导轨的 AngularJS 路由。对于身份验证,我正在使用 Angular Devise 指令。我在使用 CSRF 令牌时遇到了一些问题。

用户控制器

function userController($scope,$http,$route,$location,Auth,User) 

$scope.login = function()
  Auth.login($scope.user).then(function(user) 
    User.setCurrentUser(user);
    $location.path("/logout");
  , function(error) 
    // Authentication failed...
  );


$scope.logout = function()
  Auth.logout().then(function() 
   $location.path("/logout");
  , function(error) 
    // An error occurred logging out.
  );


 

Angular Routes.js

myApp.config(function($routeProvider, $locationProvider) 
  $locationProvider.html5Mode(true);

  $routeProvider
  .when("/login",
     templateUrl: "/assets/user/login.html",
      controller: "userController" )
  .when("/logout",
     templateUrl: "/assets/user/logout.html",
      controller: "userController" )
  .otherwise( redirectTo: "/login" );
);

模板/login.html

<div>
  <label for="user_email">Email</label><br>
  <input autofocus="autofocus" ng-model="user.email" id="user_email" name="user[email]" type="email" value="">
</div>

<div>
  <label for="user_password">Password</label><br>
  <input autocomplete="off" ng-model="user.password" id="user_password" name="user[password]" type="password">
</div>

<div>
  <input name="commit" type="submit" ng-click="login()" value="Sign in">
</div>

模板/logout.html

<a href="#" ng-click="logout()"> LOGOUT </a>

当我单击使用用户数据调用 login() 函数并且登录成功的登录按钮时,如果我单击注销按钮,则使用角度路由 ($location.path) 呈现 logout.html 页面.html ,它会引发以下错误。

ActionController::InvalidAuthenticityToken

因为 authtoken 已被登录操作使用并且不再有效。我不确定如何使用 IN angularJS 生成新的,如果我刷新页面,则注销正在工作。

【问题讨论】:

这个链接会帮助你***.com/questions/14734243/… @Nitin Verma :由于 gem 过时,现在它开始工作了。感谢您的网址。 感谢您发布新的宝石。将来会有所帮助。虽然这个宝石也在链接中的一些答案中列出。 @NitinVerma:是的,我只是从那里拿的。再次感谢您的链接。 【参考方案1】:

我换了

gem 'ng-rails-csrf'  to gem 'angular_rails_csrf'

它开始工作了,但我不确定为什么 Angular 设计建议 "ng-rails-csrf" ,它不会刷新令牌。只需添加 'angular_rails_csrf' 就可以了。

【讨论】:

以上是关于Angular 路由中的 Rails CSRF 令牌问题的主要内容,如果未能解决你的问题,请参考以下文章

Angular + Rails:POST 请求 422/CSRF 错误

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

Rails CSRF 保护与单页应用程序(反应,角度,余烬)

Rails:csrf_meta_tag 是如何工作的?

Rails 为重复的 JSON 请求自动更新 CSRF 令牌

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