gpt4 book ai didi

ruby-on-rails - Rails、设计身份验证、CSRF 问题

转载 作者:行者123 更新时间:2023-12-03 07:23:30 26 4
gpt4 key购买 nike

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

我认为这与 CSRF token 有关,当我注销时,CSRF token 会被重置(尽管它不应该是这样),并且由于它是单页,旧的 CSRF token 在 xhr 请求中发送,从而重置 session 。

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

  1. 登录
  2. 退出
  3. 登录(成功 201。但是在服务器日志中打印警告:无法验证 CSRF token 真实性)
  4. 后续ajax请求失败401未经授权
  5. 刷新网站(此时,页面标题中的 CSRF 更改为其他内容)
  6. 我可以登录,一切正常,直到我尝试退出并再次登录。

非常感谢任何线索!如果我可以添加更多详细信息,请告诉我。

最佳答案

Jimbo 出色地解释了您遇到的问题背后的“原因”。您可以采取两种方法来解决该问题:

  1. (根据 Jimbo 的建议)重写 Devise::SessionsController 以返回新的 csrf-token:

    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与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");
    });
    }

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

    $(document).ajaxSend(function (e, xhr, options) {
    xhr.setRequestHeader("X-CSRF-Token", MyApp.session.get("csrf-token"));
    });
  2. 更简单的是,如果它适合您的应用程序,您只需覆盖 Devise::SessionsController 并使用 skip_before_filter :verify_authenticity_token 覆盖 token 检查即可.

关于ruby-on-rails - Rails、设计身份验证、CSRF 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11845500/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com