当前位置: 首页 > 面试题库 >

Rails,Devise身份验证,CSRF问题

丁雅惠
2023-03-14
问题内容

我正在使用Rails做一个单页应用程序。登录和注销时,使用ajax调用Devise控制器。我遇到的问题是当我1)登录2)退出然后再次登录时不起作用。

我认为这与CSRF令牌有关,该令牌在我退出时会重置(尽管它不应该出现),并且由于它是单页的,因此在xhr请求中发送了旧的CSRF令牌,从而重置了会话。

更具体地说,这是工作流程:

  1. 登入
  2. 登出
  3. 登录(成功201。但是WARNING: Can't verify CSRF token authenticity在服务器日志中打印)
  4. 后续ajax请求失败401未经授权
  5. 刷新网站(此时,页面标题中的CSRF更改为其他内容)
  6. 我可以登录,它可以正常工作,直到我尝试退出并再次登录。

任何线索非常感谢!让我知道是否可以添加更多详细信息。


问题答案:

Jimbo做得很出色,解释了您遇到的问题背后的“原因”。您可以采用两种方法来解决此问题:

  1. (如Jimbo的建议)重写Devise :: SessionsController以返回新的csrf令牌:
        class SessionsController < Devise::SessionsController
      def destroy # Assumes only JSON requests
        signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))
        render :json => {
            'csrfParam' => request_forgery_protection_token,
            'csrfToken' => form_authenticity_token
        }
      end
    end

并在客户端为您的sign_out请求创建成功处理程序(可能需要根据您的设置进行一些调整,例如GET vs DELETE):

        signOut: function() {
      var params = {
        dataType: "json",
        type: "GET",
        url: this.urlRoot + "/sign_out.json"
      };
      var self = this;
      return $.ajax(params).done(function(data) {
        self.set("csrf-token", data.csrfToken);
        self.unset("user");
      });
    }

这还假定您将在所有AJAX请求中自动包含CSRF令牌,如下所示:

        $(document).ajaxSend(function (e, xhr, options) {
      xhr.setRequestHeader("X-CSRF-Token", MyApp.session.get("csrf-token"));
    });
  1. 更简单地说,如果适合您的应用程序,则可以简单地覆盖Devise::SessionsController和,并使用覆盖令牌检查skip_before_filter :verify_authenticity_token


 类似资料:
  • 问题内容: 我正在开发一个RailsWeb应用程序,该应用程序还为移动设备提供了基于JSON的API。移动客户端应首先通过(电子邮件/通过)获得令牌,然后客户端将使用该令牌进行后续的API调用。 我对Devise相当陌生,我正在寻找一个Devise API外观,并希望它返回true / false,然后基于此,我将创建并返回令牌或返回拒绝消息。但似乎Devise没有提供类似的信息。 我知道Devi

  • 本文向大家介绍Ruby on Rails 使用Devise进行身份验证,包括了Ruby on Rails 使用Devise进行身份验证的使用技巧和注意事项,需要的朋友参考一下 示例 将gem添加到Gemfile中: gem 'devise' 然后运行bundle install命令。 使用命令$rails generate devise:install生成所需的配置文件。 在每个环境中为Devis

  • 问题内容: 我的Rails应用程序使用Devise进行身份验证。它有一个姐妹iOS应用程序,用户可以使用与该Web应用程序相同的凭据登录到iOS应用程序。所以我需要某种API进行身份验证。 这里有许多类似的问题指向本教程,但它似乎已过时,因为此模块已从Devise中删除,并且某些行会引发错误。(我使用的是Devise 3.2.2。)我曾尝试根据该教程(和本教程)推出自己的教程,但我对此并不百分百自

  • 我正在尝试使用一个Gem devise-two-factor在Devise上实现双因素身份验证。我想验证是在2个步骤,在第一,我将要求用户名和密码。如果用户通过了这一步,那么他将被重定向到OTP的下一页,如果2FA被激活,否则会话将由Devise验证。 如果用户选择了2fa,那么我希望使用Devise来执行所有的身份验证,而不希望在User.validate_and_consume_otp(CUR

  • 问题内容: 我试图让我的自定义Java应用程序使用我们的Active Directory服务器进行身份验证,但由于某种原因我无法使其正常工作。谁能看到为什么呢?这是我的方法如下: 结果: 问题答案: 你尝试过这种方式吗? 也更换 与

  • 我正在开发一个Web应用程序 然而,我在尝试允许用户通过注册链接注册时遇到了一个问题。如果用户未经身份验证,则无法访问注册表的链接(“showRegistrationForm”) 有人能洞察为什么会发生这种情况吗?我在下面包含了我的安全配置中的代码片段