【问题标题】:InvalidAuthenticityToken, Ajax, Rails 5 with DeviceInvalidAuthenticityToken、Ajax、带设备的 Rails 5
【发布时间】:2018-05-16 13:35:18
【问题描述】:

我在 Rails 5 和 Devise 中使用 Ajax 身份验证。表用户有列被阻止,如果用户被阻止,他将被注销。我已经为 Ajax 全局设置了标题:

$(document).ajaxSend(function(e, xhr, options) {
    var token = $("meta[name='csrf-token']").attr("content");
    xhr.setRequestHeader("X-CSRF-Token", token);
});

这是 SessionsController 中被替换的 create 方法:

def create  
    if warden.authenticate(:scope => resource_name)
        if current_user.blocked
            sign_out(@user)
            return render json: {blocked: true}
        else
            return render json:{success: true}
        end
    else
        return render json: {error: true}
    end
end

如果用户被阻止并且他尝试验证来自服务器的响应是{blocked: true}。在不刷新页面的情况下,如果他再次尝试响应是错误的:

ActionController::InvalidAuthenticityToken in Users::SessionsController#create ActionController::InvalidAuthenticityToken 提取的源代码(大约第 195 行):

我在标题中看到每次用户尝试登录时都会发送令牌。 我知道这可能是问题所在,因为在第一次登录后令牌发生了变化,但是因为请求是使用 Ajax 的,所以它可以获得新的令牌,但我不知道如何解决这个问题。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2


    【解决方案1】:

    您可以在 ajax 完成时使用 ajaxComplete 事件,并在登录请求完成后设置 meta[name='csrf-token'] 内容。

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 2018-11-02
      • 2019-06-12
      • 2017-11-13
      • 2017-09-07
      • 2016-11-14
      • 1970-01-01
      • 2017-04-12
      相关资源
      最近更新 更多