InvalidAuthenticityToken,Ajax,Rails 5 with Device

时间:2017-12-02 17:16:40

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

我正在使用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}。如果没有刷新页面,如果他再次尝试,则响应是错误的:

  

UserController :: Users中的InvalidAuthenticityToken :: SessionsController #create   ActionController的:: InvalidAuthenticityToken   提取的来源(第#195行):

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

1 个答案:

答案 0 :(得分:1)

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